【问题标题】:Can't bind lvalue to rvalue reference [duplicate]无法将左值绑定到右值引用[重复]
【发布时间】:2016-10-31 20:24:52
【问题描述】:

我有这个C++测试代码sn-p,

#include <vector>

class A {
        std::vector<int> x;
public:
        A(std::vector<int>&& _x) : x(_x) {}
};

class B {
        A a;
public:
        B(std::vector<int>&& _x) : a(/*move(*/_x/*)*/) {}
};

我将_x 作为右值引用传递给B,但是当传递给A 的构造函数时它会转换为左值,我必须使用std::move() 才能使其工作。我的问题是为什么 _x 是左值而不是a() 中的右值引用?

【问题讨论】:

  • 虽然 _x 的类型是“对 std::vector 的右值引用”,但它仍然是一个左值,因为它有一个名称。您可能希望在构造函数中多次使用它,因此除非您明确想要,否则不应在第一次使用时将其移走。

标签: c++ rvalue-reference


【解决方案1】:

引用WIKI

出于安全原因,我们施加了一些限制。 命名变量永远不会被视为右值,即使它被声明为右值。要获得右值,应使用函数模板 std::move()。右值引用也只能在某些情况下修改,主要用于移动构造函数。

【讨论】:

  • 维基百科在这里不精确。类型和值类别是两个正交的概念;您不能声明值类别。例如。表达式dynamic_cast&lt;SomeClass&amp;&gt;(someObject) 的结果是lvalue-reference to SomeClass 类型,但它是一个r 值。
【解决方案2】:

任何有名字的都是左值引用。您必须在参数上使用 std::move 才能将它们作为右值引用传递。

【讨论】:

  • 不应该任何有名字的都是左值引用任何有名字的都是左值
猜你喜欢
  • 2017-12-06
  • 2014-10-31
  • 2017-04-13
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多