boost::函数常见问题解答第 3 项 http://www.boost.org/doc/libs/1_46_1/doc/html/function/faq.html具体解决了我感兴趣的场景:
为什么有 void 的解决方法
回报? C++ 允许它们!无效退货
C++ 标准允许,如
在此代码片段中:
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 怎么样?
我相信 tr1 解决了这个问题。N1836 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf(最新的 tr1 草案)说:
F 类型的函数对象 f 是
可调用参数类型 T1、T2、
..., TN 和返回类型 R,如果给定
左值 t1, t2, ..., tNoftypesT1, T2,
..., TN, 分别调用(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 为 void 时也不例外。因此在 C++11 中,您的示例应该会失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)