C ++完美函数转发

时间:2011-03-08 16:19:04

标签: c++ c++11 forwarding

这是对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个常量值?

1 个答案:

答案 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应该   总是有完整的类型或空白   类型;除了这些类型,   左值也可能不完整   类型。