Допустим, у вас есть переменная типа std::vector<std::string>
и инициализации его со списком инициализатора:Как перемещать элементы initializer_list?
using V = std::vector<std::string>;
V v = { "Hello", "little", "world", "of", "move", "semantics" };
компилятор создаст временный std::string
для каждой строки буквального, создать список инициализатора над ними, а затем вызвать CTOR для V
и создайте вектор. Ctor не знает, что все эти строки являются временными, поэтому это копия каждой строки.
Я не нашел ничего в стандарте, который позволяет вектору ctor перемещать элементы, когда они являются временными.
Я что-то упускаю или с помощью списков инициализаторов приводит к ненужным копиям? Я пишу классы, где эта проблема может привести к значительно неэффективному коду. Было бы весьма полезно оценить любую технику, чтобы избежать ненужных копий.
Хороший вопрос. Я не думаю, что списки инициализаторов изначально были предназначены *, чтобы делать что-либо, но передавать последовательность времен. Но теперь вы можете объявить переменную списка инициализатора. Это не означает, что вектор должен высасывать внутренности из каждого элемента в таком длинном списке. Но подождите, конструктор с rvalue ref в список инициализаторов. Может быть? –
@ Cheersandhth.-Alf Я думаю, я могу перегрузить список инициализаторов по const-ref, non-const-ref и rvalue-ref. Затем я могу вручную перемещать элементы из списка инициализаторов rvalue-ref. Не элегантный и не работает с контейнерами STL, которые я использую в качестве основного хранилища (вектор и карта), но лучше, чем ничего. Благодарю. –
дубликат [initializer \ _list and move semantics] (https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics) –