Запитання з тегом «move-semantics»

4
Чому ми копіюємо тоді переміщення?
Десь я побачив код, у якому хтось вирішив скопіювати об’єкт і згодом перемістити його до члена даних класу. Це залишило мене в замішанні в тому, що я думав, що вся справа в тому, щоб уникнути копіювання. Ось приклад: struct S { S(std::string str) : data(std::move(str)) {} }; Ось мої запитання: …

8
Initializer_list та перемістити семантику
Чи дозволяється мені переміщувати елементи з a 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&) для створення нових копій елементів у векторі. Чи можу я якось Aдомогтися того, що …

4
Чому немає стандартного переміщення / конструктора переміщення?
Я простий програміст. Змінні членів мого класу найчастіше складаються з типів POD та STL-контейнерів. Через це мені рідко доводиться писати оператори присвоєння або конструктори копіювання, оскільки вони реалізовані за замовчуванням. Додайте до цього, якщо я використовую std::moveна об'єктах, що не рухаються, він використовує оператор присвоєння, тобто std::moveабсолютно безпечний. Оскільки я …

2
Ефективність C ++ 11 push_back () з std :: move versus 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 …

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 здається правильним …

5
Чи є випадки, коли повернення посилання на RValue (&&) є корисним?
Чи є причина, коли функція повинна повертати посилання RValue ? Техніка, або фокус, або ідіома чи шаблон? MyClass&& func( ... ); Я усвідомлюю небезпеку повернення посилань загалом, але іноді ми все одно робимо це, чи не так? T& T::operator=(T)це лише один ідіоматичний приклад. Але як щодо T&& func(...)? Чи є …


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