无法将左值绑定到右值参考

Sam*_*mik 7 c++ rvalue-reference

我有这个C++测试代码片段,

#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/*)*/) {}
};
Run Code Online (Sandbox Code Playgroud)

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

Edw*_*nge 6

任何具有名称的都是左值引用.您必须使用std :: move on参数将它们作为右值引用传递.

  • 不应该*任何有名字的东西都是左值参考*是*任何有名字的东西都是左值*? (7认同)

O_Z*_*O_Z 5

维基百科的报价

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