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

Why is rval ref binding to lval ref function?

本文关键字:ref lval 函数 绑定 rval 为什么      更新时间:2023-10-16

在下面的代码中,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 );
}

请注意,这与右值引用被视为左值?

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

拥有右值和std::move的全部意义在于,这是一个强制转换为右值,是允许在函数和构造函数中选择正确的重载。例如,以下两种情况都解析为对testRef(int && i)的调用:

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

但是对于右值引用,情况似乎并非如此。

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

表达式从不具有引用类型。表达式rvalref具有类型 int 和值类别"左值"。

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

在表达式中,对象名称的行为是相同的,无论该名称是否是该对象的第一个名称。

decltype(general_expression) 相比,代码decltype(identifier)具有特殊行为。它不提供由该标识符组成的表达式的类型和值类别。代码decltype((identifier))会这样做。延伸阅读