#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 слегка ввел меня в заблуждение (и, по-видимому, не только меня:)