C++完美函数转发

Tho*_*eod 4 c++ forwarding c++11

这是这个问题的后续内容.

2002年关于C++中函数转发问题的论文做了以下观察:

这是Boost.Bind和Boost.Lambda当前采用的方法:

template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3)
{
    return g(a1, a2, a3);
}
Run Code Online (Sandbox Code Playgroud)

它的主要缺点是它不能转发非常数rvalue.参数推导创建非const引用,并且引用不能绑定到参数.这就是无辜的例子

int main()
{
    f(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

失败(违反C1).

我看到呼叫失败,但解释是否正确?不是文字1,2,3常量值吗?

Arm*_*yan 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限定类型; 非类rvalues始终具有cv不合格类型.Rvalues应始终具有完整类型或空白类型; 除了这些类型,左值也可以有不完整的类型.