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/

10-12 20:46