Tho*_*eod 4 c++ forwarding c++11
这是这个问题的后续内容.
2002年关于C++中函数转发问题的论文做了以下观察:
这是Boost.Bind和Boost.Lambda当前采用的方法:
Run Code Online (Sandbox Code Playgroud)template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3) { return g(a1, a2, a3); }它的主要缺点是它不能转发非常数rvalue.参数推导创建非const引用,并且引用不能绑定到参数.这就是无辜的例子
Run Code Online (Sandbox Code Playgroud)int main() { f(1, 2, 3); }失败(违反C1).
我看到呼叫失败,但解释是否正确?不是文字1,2,3常量值吗?
Are not the literals 1, 2, 3 const rvalues?
不,它们只是int类型的rvalues.根据C++标准,原始类型的rvalues不能是const限定的.
调用失败,因为它们是rvalues - 非const引用不能绑定到rvalues.
如果函数采用const A1 &, const A2&, const A3&,则调用将是正常的,但在这种情况下,函数将无法修改参数.
编辑:参考我在C++ 2003标准中的第一个语句:(3.10.9)
类rvalues可以具有cv限定类型; 非类rvalues始终具有cv不合格类型.Rvalues应始终具有完整类型或空白类型; 除了这些类型,左值也可以有不完整的类型.
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |