Вопросы с тегом «move-semantics»

4
Почему мы копируем, а затем перемещаем?
Я где-то видел код, в котором кто-то решил скопировать объект и впоследствии переместить его в член данных класса. Это привело меня в замешательство, поскольку я думал, что весь смысл перемещения заключается в том, чтобы избежать копирования. Вот пример: struct S { S(std::string str) : data(std::move(str)) {} }; Вот мои вопросы: …

8
initializer_list и семантика перемещения
Могу ли я перемещать элементы из std::initializer_list<T>? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } Поскольку std::intializer_list<T>требует особого внимания компилятора и не имеет семантики значений, как обычные контейнеры стандартной библиотеки C ++, я …

5
Могу ли я инициализировать список векторов типа «только перемещение»?
Если я пропущу следующий код через мой снимок GCC 4.7, он попытается скопировать unique_ptrs в вектор. #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } Очевидно, это не может работать, потому что std::unique_ptrне копируется: ошибка: использование удаленной функции 'std :: …

3
Как обеспечить соблюдение семантики перемещения при росте вектора?
У меня есть std::vectorобъекты определенного класса A. Класс нетривиален и имеет конструкторы копирования и перемещение конструктор определены. std::vector<A> myvec; Если я заполню вектор Aобъектами (например, используя myvec.push_back(a)), вектор будет увеличиваться в размере, используя конструктор копирования A( const A&)для создания новых копий элементов в векторе. Могу ли я каким-то образом добиться, …

4
Почему нет присваивания / конструктора перемещения по умолчанию?
Я простой программист. Переменные-члены моего класса чаще всего состоят из POD-типов и STL-контейнеров. Из-за этого мне редко приходится писать операторы присваивания или конструкторы копирования, поскольку они реализованы по умолчанию. Добавьте к этому, если я использую std::moveдля объектов, которые нельзя перемещать, он использует оператор присваивания, что означает std::moveсовершенно безопасно. Поскольку я …

2
Эффективность push_back () C ++ 11 с std :: move по сравнению с emplace_back () для уже построенных объектов
В C ++ 11, emplace_back()как правило, предпочтительнее (с точки зрения эффективности), push_back()поскольку он допускает создание на месте, но так ли это при использовании push_back(std::move())с уже созданным объектом? Например, что по- emplace_back()прежнему предпочтительнее в следующих случаях? std::string mystring("hello world"); std::vector<std::string> myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we don't care about …

3
Повторное использование перемещенного контейнера?
Как правильно повторно использовать перемещенный контейнер? std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); Из того, что я прочитал в стандартном проекте C ++ 0x; ver3 кажется правильным, поскольку …

4
Кража ресурсов из ключей std :: map разрешена?
В C ++ нормально ли красть ресурсы с карты, которая мне больше не нужна? Точнее, предположим, что у меня есть ключи std::mapс std::stringключами, и я хочу создать из него вектор путем кражи ресурсов mapс использованием ключей s std::move. Обратите внимание, что такой доступ для записи ключей нарушает внутреннюю структуру данных …
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.