当前位置: 首页 > 知识库问答 >
问题:

调用std::function

贺经纶
2023-03-14

所有报价均来自N3797。

4/3[conv]

表达式e可以隐式转换为类型T,当且仅当声明T=e;对于一些发明的临时变量t来说

这意味着任何表达式都不能隐式转换为val,因为val t=e对于所有表达式e都是非法的。即使eval类型的表达式,例如val(3),也是如此。

因此,void类型的表达式不能隐式转换为void

这让我们想到:

20.9.2/2要求[func.require]

将INVOKE(f, t1, t2,..., tN, R)定义为隐式转换为R的INVOKE(f, t1, t2,..., tN)。

简而言之,INVOKE(f, t1, t2,..., tN, R)Rval时永远无效,因为没有任何东西(包括val)可以被隐式转换为val

因此,所有std::f

20.9.11.2/7类模板函数[func.wrap.func]

要求:F应可复制。对于参数类型ArgTypes和返回类型R,f应是可调用的(20.9.11.2)。A的复制构造函数和析构函数不应引发异常。

20.9.11.2/2类模板函数[func.wrap.func]

如果表达式调用(f,declval()…,则类型为f的可调用对象f可调用参数类型ArgTypes和返回类型R。。。,R) ,被视为未赋值的操作数(第5条),格式良好(20.9.2)。

如上所示,std::function没有可调用的表达式

如果这样一个std::函数

调用[func.wrap.func.inv]

效果:调用(f,std::forward(args)。。。,R) (20.9.2),其中f是*的目标对象(20.9.1)。

asINVOKE(f,std::forward)

这种推理合理吗?


共有1个答案

沈博达
2023-03-14

是的,你的分析是正确的;我在这里得出了同样的结论。

根据Daniel Kruegler的说法,这个问题应该出现在下一次邮寄之后的库缺陷列表中:

相应的图书馆问题已提交,但在问题列表中尚不可见。

希望一旦这一点变得明显,我们也能得到一个结论性的答案,即是否允许构造签名返回的std::function传递签名返回非void的可调用函数(使用`std::function

更新:这是作为LWG 2420输入的,它被解析为有利于特殊套管void返回类型到static\u cast调用函数的结果到void。这意味着可调用的返回非void的函数可以成为std::函数的目标

 类似资料:
  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 请考虑以下类: 现在,应该启动执行的线程,因此它的实现方式如下: 这在g++-4.6.3中是完美无缺的,但在g++-4.5.2中就不行了,错误消息是 include/C++/4.5.2/Functional:180:9:error:必须使用“.”或“->”调用std::declval with_tp=void(foo::*)(长无符号int),typename std::add_rvalue_re

  • 标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int

  • 错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue 因此,它抱怨,因为只有第二个参数是rvalue

  • 在我的Fedora 34环境(g)中,定义为: 如果表达式已经是右值,那么

  • 在设计回调函数的时候,无可避免地会接触到可回调对象。在C++11中,提供了std::function和std::bind两个方法来对可回调对象进行统一和封装。 可调用对象 C++中有如下几种可调用对象:函数、函数指针、lambda表达式、bind对象、函数对象。其中,lambda表达式和bind对象是C++11标准中提出的(bind机制并不是新标准中首次提出,而是对旧版本中bind1st和bind