1

在下面的代码中,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 是右值还是左值(答案是在两种情况下它都是左值,因为它在两种情况下都有地址)。

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

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

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

4

1 回答 1

1

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

表达式永远没有引用类型。该表达式rvalref具有类型int和值类别“左值”。

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

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

与. decltype(identifier)_ decltype(general_expression)它没有给出由该标识符组成的表达式的类型和值类别。代码decltype((identifier))会这样做。进一步阅读

于 2017-02-05T03:12:59.423 回答