无法将lvalue绑定到rvalue引用

11

我有这个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()才能使其工作。我的问题是,为什么a()中的_x是左值而不是右值引用?


3
虽然 _x 的类型是“指向 std::vector<int> 的右值引用”,但它仍然是一个左值,因为它有一个名称。在构造函数中可能需要多次使用它,因此除非你明确想要这样做,否则在第一次使用时不应该将其移动。 - Corristo
2个回答

9

引用自WIKI

出于安全原因,有一些限制。即使将命名变量声明为rvalue,它也永远不会被视为rvalue。要获取rvalue,应使用函数模板std::move()。 Rvalue引用只能在特定情况下进行修改,主要用于移动构造函数。


维基百科在这里不够准确。类型和值类别是两个正交的概念;你不能声明值类别。例如,表达式dynamic_cast<SomeClass&>(someObject)的结果是lvalue-reference to SomeClass类型,但它是一个r-value。 - Corristo

8

任何有名称的都是左值引用。你需要使用std::move将参数传递为右值引用。


10
“Anything that has a name is an lvalue reference” 应该翻译为“任何有名称的东西都是左值引用”吗?还是应该翻译为“任何有名称的东西都是左值”?请注意不要改变原意,并尽可能使语言通俗易懂。 - NathanOliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接