boost :: function FAQ item 3专门针对我感兴趣的场景:
为什么有无效的变通办法 回报? C ++允许他们! Void返回 C ++标准允许使用 在此代码段中:
void f(); void g() { return f(); }
这是一个有效的用法 boost :: function因为void返回 没用过。有了无效的回报,我们 会试图编译不良形式 代码类似于:
int f(); void g() { return f(); }
本质上,不使用void返回 允许boost :: function吞下一个 回报价值。这符合 允许用户分配和调用 函数和函数对象 参数不完全匹配。
不幸的是,这在VS2008中不起作用:
int Foo();
std::tr1::function<void()> Bar = Foo;
这会产生以下错误:
c:\Program Files\Microsoft Visual Studio 9.0\VC\include\xxcallfun(7) : error C2562: 'std::tr1::_Callable_fun<_Ty>::_ApplyX' : 'void' function returning a value
这是VS2008 TR1实施的失败吗?这在VS2010中有效吗? TR1是否解决了这种能力? C ++ 0x怎么样?
答案 0 :(得分:8)
我相信tr1解决了这个问题。 N1836(最新的tr1草案)说:
F类型的函数对象f 参数类型T1,T2可调用, ...,TN和返回类型R,如果给定 左值t1,t2,...,tNoftypesT1,T2, ...,TN,INVOKE(f,t1,t2, ...,tN)格式良好([3.3]),如果R 并非无效,可转换为R.
在您的示例中,R为空,因此忽略Callable
(可转换为R)的最后一部分要求。
然而,看起来C ++ 0x(C ++ 11)改变了规则。在C ++ 11中,Callable
被定义为INVOKE(f, t1, t2, ..., tN, R)
,在[func.require]中定义为要求INVOKE(f, t1, t2, ..., tN)
可以隐式转换为R,当R为空时也没有例外。所以在C ++ 11中,你的例子应该失败。