无法将左值绑定到右值引用

Can't bind lvalue to rvalue reference

本文关键字:引用 绑定      更新时间:2023-10-16

我有这个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/*)*/) {}
};

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

引自维基

出于安全考虑,施加了一些限制。命名变量永远不会被认为是右值,即使它被声明为右值。要获取右值,应该使用函数模板std::move()

右值引用也只能在某些情况下被修改,主要用于move构造函数。

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