无法将左值绑定到右值引用
Can't bind lvalue to 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/*)*/) {}
};
我将 _x
作为右值引用传递给 B,但在传递给 A
的构造函数时它被转换为左值,我必须使用 std::move()
来实现它工作。我的问题是为什么 _x 是左值而不是 a()
?
中的右值引用
任何有名字的东西都是左值引用。您必须对参数使用 std::move 才能将它们作为右值引用传递。
引用自WIKI
出于安全原因,施加了一些限制。 命名变量永远不会被视为右值,即使它被声明为右值。要获得右值,应使用函数模板 std::move()。右值引用也只能在特定情况下修改,主要用于移动构造函数。
我有这个 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 才能将它们作为右值引用传递。
引用自WIKI
出于安全原因,施加了一些限制。 命名变量永远不会被视为右值,即使它被声明为右值。要获得右值,应使用函数模板 std::move()。右值引用也只能在特定情况下修改,主要用于移动构造函数。