Я запутался в использовании std :: move () в приведенном ниже коде:
Если я раскомментирую строку в (2), результат будет: 1 2 3
, но если я раскомментирую строку в (1) выводене было бы ничего, что означало бы, что конструктор перемещения std::vector
был вызван!
Почему мы должны сделать еще один вызов std::move
в (1), чтобы вызвать конструктор перемещения из std::vector
?
Что я понял, что std::move
получает r-value
его параметра, поэтому, почему мы должны получить r-value
из r-value
в (1)?
Я думаю, что эта строка _v = rv;
в (2) более логична и должна вызывать std::vector
конструктор перемещения для вызова без std::move
, поскольку rv
сама по себе является ссылкой r-value
в первую очередь.
template <class T>
class A
{
public:
void set(std::vector<T> & lv)
{
}
void set(std::vector<T> && rv)
{
//_v = std::move(rv); (1)
//_v = rv; (2)
}
private:
std::vector<T> _v;
};
int main()
{
std::vector<int> vec{1,2,3};
A<int> a;
a.set(std::move(vec));
for(auto &item : vec)
cout << item << " ";
cout << endl;
return 0;
}