Chcę napisać klasę kontenera. Ten kontener ma metodę wstawiania, która ma dwie specjalizacje - najpierw używa konstruktorów kopiujących do kopiowania danych z jednego kontenera do innego elementu kontenera. Jeśli konstruktor kopiowania zgłasza wyjątek, po prostu cofam wszystkie zmiany w kontenerze, tak jak nic się nie dzieje.Wyjątek bezpieczny kod i semantyka ruchu
Druga specjalizacja wykorzystuje konstruktor ruchu i to jest miejsce, w którym rzeczy się komplikują. Gdy przenoszę elementy z jednego kontenera do innego elementu kontener po elemencie, konstruktor move może podać wyjątek. Jeśli tak się stanie - mam naprawdę brudny stan, gdy niektóre elementy są przenoszone, a inne elementy pozostają w jego oryginalnych miejscach. Jeśli spróbuję przenieść elementy z powrotem - mogę uzyskać kolejny wyjątek.
Czy można napisać coś takiego w sposób bezpieczny lub wyjątkowy, a bezpieczeństwo i semantyka wzajemnie się wykluczają?
Nie otrzymuję "PS". Czy mógłbyś rozwinąć? –
Jeśli twój ruch może rzucić, std :: move_if_noexcept fallbacks to copy. ALE! jeśli twoje rzeczy nie mają konstruktora kopiowania, std :: move_if_noexcept mówi "Meh" i przenosi go (co jeszcze może zrobić naprawdę?), prawdopodobnie otrzymując wyjątek i pozostawiając swój kontener w naprawdę złym stanie. –
Straszny wybór, aby zdefiniować w ten sposób IMO ... możesz stworzyć własną wersję (bez wartości '&& std :: is_copy_constructible ::), która spowoduje błąd czasu kompilacji. –
Joe