boost::function FAQ item 3专门解决了我感兴趣的场景:
为什么有无效退货的解决方法?C++ 允许它们!C++ 标准允许无效返回,如以下代码片段所示:
void f(); void g() { return f(); }
这是 boost::function 的有效用法,因为不使用 void 返回。使用 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 怎么样?