Pytania otagowane jako move-semantics

4
Dlaczego kopiujemy, a potem przenosimy?
Widziałem gdzieś kod, w którym ktoś zdecydował się skopiować obiekt, a następnie przenieść go do członka danych klasy. Wprawiło mnie to w zakłopotanie, ponieważ myślałem, że celem przeniesienia jest uniknięcie kopiowania. Oto przykład: struct S { S(std::string str) : data(std::move(str)) {} }; Oto moje pytania: Dlaczego nie bierzemy odniesienia do …

8
initializer_list i przenoszenie semantyki
Czy mogę przenosić elementy z 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? } } Ponieważ std::intializer_list<T>wymaga specjalnej uwagi kompilatora i nie ma semantyki wartości, takiej jak zwykłe kontenery biblioteki standardowej C ++, …

5
Czy mogę zainicjować listowo wektor typu tylko do przenoszenia?
Jeśli przekażę następujący kod przez moją migawkę GCC 4.7, spróbuje skopiować unique_ptrs do wektora. #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } Oczywiście to nie może działać, ponieważ std::unique_ptrnie można go skopiować: błąd: użycie usuniętej funkcji 'std :: unique_ptr …

3
Jak wymusić semantykę ruchu, gdy wektor rośnie?
Mam std::vectorobiekty określonej klasy A. Klasa jest nietrywialna i ma zdefiniowane konstruktory kopiujące i przenoszące. std::vector<A> myvec; Jeśli wypełnię wektor Aobiektami (używając np. myvec.push_back(a)), Wektor będzie się powiększał, używając konstruktora kopiującego A( const A&)do tworzenia nowych kopii elementów w wektorze. Czy mogę w jakiś sposób wymusić, że Azamiast tego używany …

4
Dlaczego nie ma domyślnego przypisania do przenoszenia / konstruktora przenoszenia?
Jestem prostym programistą. Zmienne składowe mojej klasy najczęściej składają się z typów POD i kontenerów STL. Z tego powodu rzadko muszę pisać operatory przypisania lub konstruktory kopiujące, ponieważ są one implementowane domyślnie. Dodajmy do tego, że jeśli używam std::movena obiektach, które nie są ruchome, używa operatora przypisania, co oznacza, że …

2
Wydajność C ++ 11 push_back () z std :: move versus embrace_back () dla już skonstruowanych obiektów
W C ++ 11 emplace_back()jest ogólnie preferowane (pod względem wydajności), push_back()ponieważ umożliwia konstruowanie w miejscu, ale czy nadal tak jest w przypadku używania push_back(std::move())z już zbudowanym obiektem? Na przykład, czy emplace_back()nadal jest preferowany w takich przypadkach jak poniżej? std::string mystring("hello world"); std::vector<std::string> myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we …

3
Ponownie używasz przeniesionego kontenera?
Jaki jest prawidłowy sposób ponownego wykorzystania przeniesionego kontenera? 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); Z tego, co przeczytałem w wersji roboczej standardu C ++ 0x; ver3 wydaje …

4
Czy dozwolone jest kradzież zasobów z kluczy std :: map?
Czy w C ++ można ukraść zasoby z mapy, której już nie potrzebuję? Mówiąc dokładniej, załóżmy, że mam klucze std::mapz std::stringi chcę z niego zbudować wektor, kradnąc zasoby mapkluczy s za pomocą std::move. Zauważ, że taki dostęp do zapisu do kluczy psuje wewnętrzną strukturę danych (porządkowanie kluczy), mapale nie będę …
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.