boost::function FAQ item 3专门解决了我感兴趣的场景:
不幸的是,这在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呢?
最佳答案
我相信tr1解决了这个问题。 N1836(最新的tr1草案)说:
在您的示例中,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无效时也不异常(exception)。因此,在C++ 11中,您的示例将失败。
关于c++ - tr1::function可以吞下返回值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6628442/