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

Chr*_*ris 9 c++ tr1 boost-function c++11

boost :: function FAQ第3项专门针对我感兴趣的场景:

为什么返回void会有变通方法?C++允许他们!C++标准允许Void返回,如下面的代码片段所示:

void f();
void g() { return f(); }
Run Code Online (Sandbox Code Playgroud)

这是boost :: function的有效用法,因为不使用void返回.使用void返回时,我们将尝试编译类似于以下内容的格式错误的代码:

int f();
void g() { return f(); }
Run Code Online (Sandbox Code Playgroud)

本质上,不使用void返回允许boost :: function吞下返回值.这与允许用户使用不完全匹配的参数分配和调用函数和函数对象是一致的.

不幸的是,这在VS2008中不起作用:

int Foo();
std::tr1::function<void()> Bar = Foo;
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

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
Run Code Online (Sandbox Code Playgroud)

这是VS2008 TR1实现的失败吗?这在VS2010中有效吗?TR1是否解决了这种能力?C++ 0x怎么样?

How*_*ant 8

我相信tr1解决了这个问题. N1836(最新的tr1草案)说:

如果给定左值t1,t2,...,tNoftypesT1,T2,...,TN,则F类型的函数对象f可用于参数类型T1,T2,...,TN和返回类型R ,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中,你的例子应该会失败.

  • 你知道这个变化/回归是否存在理由?如果没有,这听起来像是一个缺陷. (2认同)