C перемещать данные в конструкторе класса без копирования

#c #constructor #move

#c #конструктор #переместить

Вопрос:

Я изучаю семантику перемещения, и мне интересно, какой правильный способ переместить данные в конструктор класса без их копирования. Например, предположим, что у нас есть Container класс, который имеет только std::vector<int> данные-члены в качестве. Я хочу сначала инициализировать и построить этот вектор где-нибудь, затем я хочу создать Container объект и переместить содержимое вектора в его данные-члены без копирования. Насколько я понял (и протестировал), работает следующий код:

 class Container
{
    std::vector<int> m_data;
public:
    Container(std::vector<int>amp;amp; data) : m_data{std::move(data)} {};
};

// Somewhere else
std::vector<int> data = someFunction();
// Do more stuff in between
Container container(std::move(data));
 

Если я попытаюсь получить доступ к элементам с data[1] помощью after that, это приведет к segfault, что правильно, потому data что было перемещено container.m_data .

Вопрос: это правильный способ решения проблемы, с которой я сталкиваюсь? Может быть, есть более элегантный и чистый способ (например, чтобы избежать двойного использования std::move() как в конструкторе, так и в вызове конструктора)?

Заранее благодарю вас за помощь.

Комментарии:

1. нет, это правильно

2. Комментарий @bloody отключен … как только вы начнете объявлять один из «пяти», вы должны следовать правилу пяти. Здесь вы должны использовать правило нуля.

3. @bloody сгенерированный компилятором конструктор перемещения для Container не имеет std::vector аргумента

4. @largest_prime_is_463035818 Правильно, спасибо за замечание. Шаблон Op слегка ввел меня в заблуждение (и, по-видимому, не только меня:)