4

这是对这个问题的跟进。

一篇 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);
}

它的主要缺陷是它不能转发非常量右值。参数推导创建一个非常量引用,并且该引用不能绑定到参数。这使得无辜的例子

int main()
{
    f(1, 2, 3);
}

失败(违反 C1)。

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

4

1 回答 1

6

Are not the literals 1, 2, 3 const rvalues?

不,它们只是 int 类型的右值。根据 C++ 标准,原始类型的右值不能是 const 限定的。

调用失败,因为它们是右值- 非常量引用不能绑定到右值。

如果函数 take ,调用就可以了const A1 &, const A2&, const A3&,但在这种情况下,函数将无法修改参数。

编辑:参考我在 C++ 2003 标准中的第一条语句:(3.10.9)

类右值可以有 cv 限定类型;非类右值总是有 cv 非限定类型。右值应始终具有完整类型或 void 类型;除了这些类型之外,左值还可以有不完整的类型。

于 2011-03-08T16:24:00.247 回答