Не могу привязать lvalue в rvalue ссылка


У меня есть этот фрагмент кода теста 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 в качестве ссылки rvalue, но он преобразуется в lvalue, когда передается в конструктор A, и мне приходится использовать std::move(), чтобы заставить его работать. Мой вопрос заключается в том, почему _x является lvalue, а не ссылкой rvalue в a()?

2 3

2 ответа:

Цитата из WIKI

в целях безопасности вводятся некоторые ограничения. именованная переменная никогда не будет считаться rvalue, даже если она объявлена как таковая. Для получения значения rvalue следует использовать шаблон функции std:: move () . Ссылки Rvalue также могут быть изменены только при определенных обстоятельствах, поскольку они предназначены для использования в основном с конструкторами перемещения.

Все, что имеет имя, является ссылкой lvalue. Вы должны использовать параметры std::move on, чтобы передать их в качестве ссылок rvalue.