2012-02-12 9 views
13

Czytałem niektóre sprzeczne artykuły dotyczące tego, czy konstruktorzy ruchu/zadania mogą rzucać, czy nie.Czy od konstruktorów ruchu nie trzeba nic robić?

Dlatego chciałbym zapytać, czy konstruktorzy/zadania przeniesienia mogą rzucić w ostatecznym standardzie C++ 11?

+0

Nic nie widziałem w standardzie, że konstruktory move nie mogą rzutować, ale widziałem, że "Domyślnie deklarowany konstruktor ruchu dla klasy X będzie miał postać ' X :: X (X &&) ' ", i nie widzę tam" noexcept ". –

+0

W ostatecznej wersji roboczej nie widzę opcji "noexcept" zadeklarowanej dla dowolnej funkcji ... – ronag

+0

@ronag: Czy na pewno szukasz? Ponieważ otworzyłem N3337 i właśnie szukałem "' noexcept'' i natychmiast uzyskałem funkcję 'swap 'jakiejś klasy. –

Odpowiedz

17

Czy ogólnie konstruktorzy ruchów mogą rzucać? Tak. Czy powinny one być? Nie.

Zasadniczo nic w nich nie powinno być czymś, co mogłoby rzucić. Nie powinieneś przydzielać pamięci, wywoływać innego kodu ani niczego w tym stylu. Jedynym powodem do napisania konstruktora ruchu jest odejście od cudzych wskaźników pamięci i odniesień do obiektów. Powinieneś kopiować kilka podstawowych typów i usuwać wartości z drugiego obiektu. Te rzeczy nie powinny rzucać.

Tak więc, o ile jest to dozwolone, nie jest to dobry pomysł. Jeśli to robisz, przemyśl to, co robisz w operacjach przenoszenia.

+0

Zakładam, że w konstruktorze przenoszenia nie pojawiają się typy standardowe? Jedyne miejsca, o które powinienem się martwić, to USD? – ronag

+6

@ronag: Jeśli typ std :: nie ma wyrażenia 'noexcept' w konstruktorze ruchu, można go wyrzucić. W szczególności niektóre implementacje kontenerów opartych na węzłach mają konstruktor ruchu rzutowania, ponieważ każdy kontener musi zawierać przydzielony sterty węzeł końcowy, a nawet puste kontenery. Inne implementacje tych samych kontenerów nie mają tego projektu i dlatego mogą (i mogą mieć) mieć konstruktor ruchu noexcept. –

Powiązane problemy