Правильный способ реализации семантики перемещения для класса с помощью std :: vector члена std :: vector - PullRequest
1 голос
/ 27 сентября 2011

У меня есть класс, в котором есть член, который является вектором векторов.Я хотел бы написать конструктор для этого класса, который принимает ссылку r-значения на один вектор в качестве аргумента и перемещает его в вектор-член в качестве одного вектора элемента аргумента вектора.Пока у меня есть:

class AClass
{
    std::vector<std::vector<int>> member;

public:

    AClass(std::vector<int> &&vec) : member(1) 
    {
        member[0] = std::vector<int>(std::move(vec));
    }
}

Кажется, это работает правильно, но я не уверен, что std::move около vec необходимо.Или если бы std::vector позаботился бы обо мне об этом, если бы я написал это немного по-другому.

Ответы [ 2 ]

5 голосов
/ 27 сентября 2011

Должно быть короче написать:

member[0] = std::move(vec);

, чтобы вызвать

vector<T,Allocator>& operator=(vector<T,Allocator>&& x);

Насколько я знаю, явное перемещение необходимо, потому что vec не являетсяrvalue (это именованная переменная и может использоваться в левой части operator=).

0 голосов
/ 27 сентября 2011

Способ сделать это сейчас - просто передать значение в конструктор по значению, а затем переместить его туда, куда вы хотите.Итак,

AClass(std::vector<int> vec)
{
    member.emplace_back(std::move(vec));
}

Вам не нужно заботиться о том, является ли значение созданным с помощью копирования, или его можно было перенести в конструктор, потому что это было значение или что-то еще.Вы просто запрашиваете в определении функции, что вы получите свою собственную копию предмета, и язык предоставит ее вам как можно лучше.

...