Standard nie wymusza żadnego wyjątku na konstruktorach ruchu. W jakich okolicznościach jest to dopuszczalne/konieczne, aby konstruktor ruchu mógł rzucić?Kiedy powinienem zadeklarować konstruktor ruchu bez żadnego wyjątku?
Odpowiedz
Złotą zasadą tutaj jest: Zależy od.
Oto przykład, gdzie potęga sens:
// A lock_guard template somewhere up here...
template<typename mutex_t>
class shared_lock_guard
{
mutex_t *mtx_ptr;
public:
shared_lock_guard(lock_guard<mutex_t> &&other) :
mtx_ptr{other.mtx_ptr}
{
if(this->mtx_ptr){
// this might throw a system_error
// if the syscall fails or if the
// lock state was corrupted.
//
this->mtx_ptr->shared_relock();
}
other.mtx_ptr = nullptr;
}
// rest of implementation, etc...
};
Kiedy naprawdę nie mają wyboru. Najczęściej konstruktor ruchu powinien być noexcept
. I są domyślnie.
Szczególnie ważne jest, aby używać noexcept dla typów, które są przeznaczonych do stosowania ze standardowymi pojemnikami bibliotecznych. Jeśli przenoszenie konstruktora dla typu elementu w kontenerze nie jest równe zeru, to wówczas kontener użyje konstruktora kopiującego, a nie konstruktora przemieszczania .
Czy możesz podać przykład sytuacji, w której nie mam wyboru? – Klaufir
@Klaufir Przypuszczam, że gdybyś miał (powiedzmy) kontener gwarantujący zachowanie podobne do atomistycznego (albo przesuwałby wszystko albo nie poruszał się), a twoje elementy nie byłyby kopiowalne (na przykład uchwyt) - więc bez planu B - wtedy twój typ elementu nie działałby. –
@Klaufir Nie, przykro mi, nie mam przykładu :(Może bardziej doświadczona ppl może coś wymyślić. – Xaqq
- 1. Visual Studio kończy debugowanie bez żadnego wyjątku lub błędu.
- 2. Dlaczego wywoływany jest konstruktor ruchu?
- 3. Jak poprawnie zdefiniować konstruktor ruchu?
- 4. konstruktor ruchu dla std :: runtime_error
- 5. Aplikacja kolby podnosi błąd 500 bez żadnego wyjątku
- 6. Dlaczego wywołuje to konstruktor kopiowania, a nie konstruktor ruchu?
- 7. Dlaczego ten konstruktor kopiowania jest wywoływany, a nie konstruktor ruchu?
- 8. Czy konstruktor prywatnego ruchu uniemożliwia przeniesienie?
- 9. Automatycznie generowany konstruktor ruchu z niezmiennymi elementami
- 10. Jawny konstruktor ruchu potrzebny w kontenerze?
- 11. W ActiveJob, jak złapać żadnego wyjątku
- 12. Jersey nie może złapać żadnego wyjątku Jacksona
- 13. Jak powinienem zadeklarować ciągi w strukturach C?
- 14. Gdzie powinienem zadeklarować zmienną sesji w asp.net
- 15. powinienem zadeklarować obiekt wzór jako statyczny
- 16. Kiedy powinienem użyć `--interactive` bez` --tty` w kontenerze Docker?
- 17. C# jaki rodzaj wyjątku powinienem podnieść?
- 18. Kiedy używać nowego wyjątku typu:
- 19. Jak zadeklarować konstruktor kopiowania w klasie pochodnej, bez domyślnego konstruktora w bazie?
- 20. WCF - kiedy powinienem używać netTcpBinding
- 21. Kiedy zadeklarować nową (anonimową) funkcję w javascript?
- 22. Dlaczego nie został wywołany konstruktor ruchu std :: string?
- 23. Jak zaimplementować konstruktor ruchu dla dziedziczenia w kształcie rombu?
- 24. Kiedy powinienem dzwonić flush() na SQLAlchemy?
- 25. powinienem zadeklarować const metoda, gdy bazowego stan OpenGL jest zmodyfikowaną
- 26. Wyłączanie konstruktora ruchu
- 27. Aplikacja Android zamyka się bez żadnego błędu.
- 28. Dlaczego można zadeklarować zmienną bez wartości początkowej?
- 29. Pracownik selekcji wisi bez żadnego błędu.
- 30. SecItemCopyMatching zwraca wartość zerową bez żadnego błędu
+1, ale należy pamiętać, że ruch jest optymalizacją. Moim zdaniem, wartości odniesienia r to jedna z rzeczy, o których ludzie spędzają zbyt dużo czasu na myśleniu. Najlepszy konstruktor ruchu, który możesz napisać, to żaden. Konstruktor ruchu rzucania nie jest świetnym wyborem, ale jeśli jest to twój jedyny wybór, a twoje profilowanie pokazuje, że jest to ulepszenie w stosunku do kopii na krytycznej ścieżce, byłoby ciężko argumentować przeciwko niemu. –