所有报价均来自N3797。
4/3[conv]
表达式e可以隐式转换为类型T,当且仅当声明T=e;对于一些发明的临时变量t来说
这意味着任何表达式都不能隐式转换为val
,因为val t=e
对于所有表达式e
都是非法的。即使e
是val
类型的表达式,例如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)
在R
为val
时永远无效,因为没有任何东西(包括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)。
as
INVOKE(f,std::forward)
这种推理合理吗?
是的,你的分析是正确的;我在这里得出了同样的结论。
根据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