Powiedzmy masz zmienną typu std::vector<std::string>
i zainicjować go z listy inicjatora:Jak przenieść elementy pliku initializer_list?
using V = std::vector<std::string>;
V v = { "Hello", "little", "world", "of", "move", "semantics" };
Kompilator stworzy tymczasowy std::string
dla każdej struny dosłownym, utworzyć listę initializer na nich, a następnie wywołać konstruktor dla V
i utwórz wektor. Ctor nie wie, że wszystkie te ciągi są tymczasowe, więc jest to każdy ciąg znaków.
Nie znalazłem niczego w standardzie, który pozwala ctorowi wektorowemu przesuwać elementy, gdy są tymczasowe.
Czy czegoś brakuje lub czy korzystanie z list inicjalizujących prowadzi do niepotrzebnych kopii? Piszę klasy, w których ten problem może prowadzić do znacznie nieefektywnego kodu. Każda technika unikania niepotrzebnych kopii byłaby bardzo doceniana.
Dobre pytanie. Nie sądzę, że listy inicjalizatorów były pierwotnie * przeznaczone * do robienia czegokolwiek, ale przekazywały sekwencję plików tymczasowych. Ale teraz możesz zadeklarować zmienną listy inicjalizatorów. Nie byłoby to możliwe, gdyby wektor wysysał wnętrzności z każdego przedmiotu na tak długiej liście. Ale czekaj, konstruktor z wartością rvalue ref do listy inicjalizatora. Może? –
@ Cheersandhth.-Alf Myślę, że mogę przeciążać na listy inicjalizatora przez const-ref, non const-ref i rvalue-ref. Mogę następnie ręcznie przenieść elementy z listy inicjalizującej rvalue-ref. Nie jest elegancka i nie działa z kontenerami STL, z których obecnie korzystam jako pamięci bazowej (wektor i mapa), ale lepiej niż nic. Dzięki. –
duplikat [inicjalizator \ _list i semantyka ruchu] (https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics) –