tr1 :: function可以吞下返回值吗?

时间:2011-07-08 17:59:44

标签: c++ c++11 tr1 boost-function

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怎么样?

1 个答案:

答案 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中,你的例子应该失败。