Ваша структура Test
не определяет никаких специальных функций-членов (конструктор копирования, деструктор и т. Д.). Это означает, что оператор назначения перемещения по умолчанию и конструктор копирования перемещения по умолчанию генерируются автоматически, и они будут перемещать каждый элемент данных структура. Таким образом, Test
является подвижным типом, и он выигрывает от этого, поскольку vector<size_t>
является подвижным элементом данных.
Однако перемещения не выполняются автоматически, потому что перемещение от объекта меняет его. Даже если вы думаете, что это:
vecOfTest.push_back(test);
}
будет делать неявное движение, потому что область действия заканчивается, это не будет. Неявные действия могут поставить как компилятор, так и программиста в сложную ситуацию. Компилятор должен доказать, что аннулирование test
в порядке. Программист должен был бы постоянно исследовать, нужен ли явный ход или нет, и конечным результатом этого будет просто делать явные ходы или нет. Поэтому по этой причине неявные перемещения не происходят (но см. Ниже исключение из правила.) Вы должны сделать это самостоятельно:
vecOfTest.push_back(std::move(test));
Единственный случай, когда вам не нужно двигаться, это когда движение мешало бы выбору. Например, в функции, которая возвращает Test
, это:
Test test;
return std::move(test);
будет двигаться, но лучше не делать. Лучше:
return test;
вместо этого. Это не скрытый шаг. Это решение. Elision быстрее движения, и выполнение движения предотвратит его. Однако в тех случаях, когда исключение невозможно, выполняется неявное перемещение. Это единственный известный мне случай, когда произойдет неявное движение: в качестве замены для исключения. Ваш оригинальный код:
vecOfTest.push_back(test);
не подходит для исключения, и поэтому неявное движение никогда не произойдет.