为什么rval ref绑定到lval ref函数?

时间:2017-02-04 12:44:13

标签: c++ c++11 reference-binding

在下面的代码中,is_rvalue_reference返回true。 我希望调用testRef(int &&)而不是testRef(int &),但事实并非如此(至少使用我的Visual Studio 2015编译器)。

任何想法的原因?

void testRef( int&& i )
{
    cout << "called testRef(int&&) " << endl;
}

void testRef( int& i )
{
    cout << "called testRef(int&) " << endl;
}

int main()
{
    int && rvalref = 4;
    cout << "is rval? : " << std::is_rvalue_reference<decltype( rvalref )>() << endl;
    testRef( rvalref );
}

请注意,这与Rvalue Reference is Treated as an Lvalue?

中的问题不同

在那篇文章中,他们谈论的是函数中的变量 :它就像在我的例子中询问变量i是左值还是左值(答案是它是两种情况下的左值,因为它在两种情况下都有一个地址。)

具有rvalues和std::move(它是rvalue的强制转换)的重点是允许在函数和构造函数中选择正确的重载。 例如,以下两种情况都解析为对testRef(int && i)的调用:

int main()
{
  int g = 3;
  testRef(std::move(g));
  testRef(4);
}

但是使用右值参考似乎并非如此。

1 个答案:

答案 0 :(得分:1)

rvalref是对象的标识符。对象的标识符始终是左值。

表达式永远不会有引用类型。表达式rvalref的类型为int,值类别为“左值”。

在声明int && rvalref中,&&描述了如何初始化rvalref(即通过向另一个表达式表示的对象添加新名称,而不是创建新对象), 就这样。

在表达式中,对象名称的行为是相同的,无论名称是否是赋予该对象的名字。

decltype(identifier)相比,代码decltype(general_expression)具有特殊行为。它没有给出由该标识符组成的表达式的类型和值类别。代码decltype((identifier))会这样做。 Further reading