std::function 构造函数和 nullptr

2024-01-12

为什么以下代码打印“0”作为输出?

#include <functional>
#include <iostream>

int main()
{
    typedef void (*fp_t)();

    fp_t fp = nullptr;

    std::function<void()> f = fp;
    std::cout << (f == nullptr) << '\n';
}

我已经使用 gcc 4.7.2 和 MSVC-11.0 对其进行了测试。

我认为它应该打印“1”,因为标准中引用了以下内容:

ISO/IEC 14882:2011

20.8.11.2.1 函数构造/复制/销毁 [func.wrap.func.con]

template<class F> function(F f);
template<class F, class A> function(allocator_arg_t, const A& a, F f);

...

8 后置条件: !*this如果满足以下条件之一: —f is a NULL函数指针。 —f is a NULL指向成员的指针。 —F是一个实例 函数类模板的,以及!f


我认为这是一个错误。根据 C++11 标准第 20.8.11.2.6/1 段:

template <class R, class... ArgTypes>
bool operator==(const function<R(ArgTypes...)>& f, nullptr_t) noexcept;

template <class R, class... ArgTypes>
bool operator==(nullptr_t, const function<R(ArgTypes...)>& f) noexcept;

1 Returns: !f.

所以,(f == nullptr)应该评估为true当且仅当!f评估为true。然后,第 20.8.11.2.1/8 段规定:

template<class F> function(F f);
template <class F, class A> function(allocator_arg_t, const A& a, F f);

[...]

8 后置条件:!*this如果满足以下任一条件:

f是一个NULL函数指针。

[...]

Since fp是一个空函数指针,上面这段应该保证在初始化之后f from fp, 表达方式!f评估为true。这反过来意味着,与nullptr应该返回true(根据第 20.8.11.2.6/1 条)。

这反过来意味着,这是一个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::function 构造函数和 nullptr 的相关文章

随机推荐

  • 在 mac osx leopard/snow leopard 中获取鼠标光标下的文本

    有什么想法可以让文本位于鼠标光标下吗 我正在尝试构建一个字典应用程序 当鼠标悬停在单词上时会弹出一个翻译面板 我查看了可访问性API 它只能找到当前的ui元素 但不能找到当前的单词 我最后的选择是经常截图 然后进行ocr 这会消耗CPU 我
  • 如何设置内存存储库

    我有以下课程 public class InMemoryRepository IRepository public void Add object entity throw new NotImplementedException publi
  • 使用 GitHub 页面,空白屏幕

    我正在尝试使用 username github io 在 github 页面上创建一个 React 项目 但是当我打开链接时 它只返回一个白屏 没有任何错误消息 当我使用自定义域名时也会发生这种情况 但是 当我在本地运行它以及使用 gh p
  • iOS:我可以检测设备屏幕是否打开/关闭吗?

    如何在 iOS 中检查屏幕是打开还是关闭 我想知道屏幕当前是否打开 即使我的应用程序在后台 我想要一个事件侦听器 谢谢 In Swift 3你可以做 override func viewDidLoad super viewDidLoad O
  • 使用 Core Data 时如何正确设置 NSPredicate 来实现一对多关系?

    我有一个核心数据模型 其中任务实体包含与 ExcludedDay 实体的可选对多关系 ExcludedDays ExcludedDay 的属性之一是 day 它是一个 NSDate 对象 ExcludedDay 实体与 Task 实体具有反
  • JDBC 和 SQL Server 连接问题

    我对 Java 很陌生 我是一个纯粹的 net 人 我正在尝试进行 SQL Server 2008 数据库连接 现在我正在使用 jTDS 驱动程序来完成我的工作 db dbConnect jdbc jtds sqlserver XXXXXX
  • 原因及解决方法如何-[__NSCFConstantString trim]? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我用j2objc 从 爪哇 到obj
  • 消息正文上的 Azure 服务总线订阅筛选器

    我想根据消息的内容创建订阅 这可能吗 我试图摆脱添加自定义属性的麻烦 谢谢 这是不可能的 订阅只能根据标准 系统 和自定义 用户 属性进行过滤 如果正文 有效负载中有需要参与过滤的数据 则需要将其提升到标头
  • 如何使用非交互式身份验证连接到 Power BI API?

    用 C 编码 我正在遵循本指南 https azure microsoft com en us documentation articles resource group authenticate service principal aut
  • webpack dev server 的惰性模式有什么作用?

    我正在运行我的 webpack dev server webpack dev server lazy inline progress colors port 8082 但是 当我的浏览器尝试访问时 会显示 404 错误bundle js 其
  • 编译器构建的语义分析阶段有哪些工具?

    编译器构建可以分为词法分析 语法分析 语义分析等几个阶段 词法分析有Lex Flex等工具 语法分析有Yacc Bison等工具 我只是好奇语义分析阶段有哪些可用的工具 据我所知 没有与语言无关的工具来执行类型检查 如果有的话 它们肯定不会
  • Windows:Numpy mkl_intel_thread.dll

    经过几个小时的尝试和调查 我已经成功解决了这个问题Numpys mkl intel thread dll文件错误 以下内容可能无法解决所有情况 但我会尝试解释我的特定案例的详细信息 以帮助其他遇到相同问题的人 我的问题 当尝试启动 Anac
  • GRUB 是否切换到保护模式?

    我想问一下 启动时将CPU切换到保护模式是GRUB还是Linux内核 我还想问 内核本身 vmlinuz 是 ELF 还是纯二进制格式 谢谢 GRUB does让你进入保护模式 GRUB多重引导规范 版本 0 6 96 第 3 2 节 ht
  • Django 中的静态文件和媒体文件有什么区别?

    我正在转向 Django 1 3 发现媒体和静态文件的这种分离有点令人困惑 这是默认的方式settings py好像 Absolute filesystem path to the directory that will hold user
  • 以编程方式添加过滤器和初始化参数

    我需要将 web xml 的内容复制到 WebAppInitializer class Java 配置类 我已经从 web xml 复制了 YahooFilter 类 请参阅代码 但我不确定如何实用地添加 init params 我已在下面
  • Mongodb 返回旧集合

    router post orders finish function req res next var order id req body order id var user id req body user id var table id
  • 在 Chart.js 图表的 x 轴上仅显示第 n 个刻度线

    我一直在寻找这个问题的解决方案一段时间 但由于大量已删除的文档和该库以前版本的黑客答案 我还没有接近解决方案 我正在使用 ChartJS v2 制作一个图表 x 轴上带有季度月份名称 并且我设置了标签 以便仅显示每 4 个标签 即每年一个
  • 我可以将 UILocalnotification 设置为每个月的最后一天重复吗?

    我想自己尝试一下 但我需要一个月的时间才能确定它是否有效 有人尝试过这个吗 NSDate fireDate Date I want to repeat in this case 31 may localNotification fireDa
  • 在 Javascript 测试中断言对象相等 (chai)

    我需要在 JavaScript 单元测试中断言两点之间相等 var pnt1 x 2 y 3 and var pnt2 x 2 y 3 当我做 assert equal pnt1 pnt2 据说要点不同 我可以从检查中排除对象是不同实例的事
  • std::function 构造函数和 nullptr

    为什么以下代码打印 0 作为输出 include