【发布时间】:2011-10-01 11:44:22
【问题描述】:
boost::function FAQ item 3 专门针对我感兴趣的场景:
为什么会有 void 的变通方法 回报? C++ 允许它们!无效退货 C++ 标准允许,如 在这段代码sn-p中:
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 怎么样?
【问题讨论】:
-
void g() { return f(); }允许支持模板代码,其中函数的返回类型可能事先不知道......如果@987654328 实际返回值,f()仍然是错误的@ 才不是。鉴于此,我不会惊讶地发现标准委员会选择在这方面与 Boost 的实现有所不同,因为它提供了更直观的行为。但由于 gcc 确实 允许这种行为,我并不肯定。
标签: c++ c++11 tr1 boost-function