c++ - 为什么 rval ref 绑定(bind)到 lval ref 函数?

标签 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 是右值还是左值(答案是它在两者中都是左值例,因为它在这两种情况下都有一个地址)。

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

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

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

最佳答案

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

表达式从来没有引用类型。表达式 rvalref 具有类型 int 和值类别“lvalue”。

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

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

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

关于c++ - 为什么 rval ref 绑定(bind)到 lval ref 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040513/

相关文章:

c++ - 可以通过 const 引用返回默认参数的值吗?

c++ - 使用 Boost Asio 的快速数据(图像)传输服务器客户端

c++ - 尝试在 C++/CLI 项目中调用 GetAsyncKeyState() 时出错

c++ - 什么时候引用是右值引用?

c++ - std::move 两个双端队列 - 输入与输出迭代器

c++ - const 引用是否绑定(bind)到另一个从临时悬挂引用转换而来的引用?

c++ - memset 函数在我的 C++ 动态数组初始化中不起作用

c++ - 在C++中可以做 “call by reference when possible”吗?

c++ - 与 auto_ptr 声明不同,unique_ptr 声明是否在其模板类型为不完整类型时是明确定义的?

c++ - 对类型 'A *' 的非常量左值引用无法绑定(bind)到不相关类型 'std::shared_ptr<A>' 的值