这是对this问题的跟进。
关于C ++中函数转发问题的2002 paper进行了以下观察:
这是目前使用的方法 作者:Boost.Bind和Boost.Lambda:
template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3) { return g(a1, a2, a3); }
它的主要缺点是它不能 转发非const rvalue。该 参数推导创建一个非常量 参考,参考不能 绑定到参数。这使得 无辜的例子
int main() { f(1, 2, 3); }
失败(违反C1)。
我看到呼叫失败,但解释是否正确?文字是不是1,2,3个常量值?
答案 0 :(得分:6)
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-qualified 类型;非阶级的价值总是有的 cv-不合格的类型。 Rvalues应该 总是有完整的类型或空白 类型;除了这些类型, 左值也可能不完整 类型。