Der Standard erzwingt keine Ausnahmen bei Verschiebungskonstruktoren. Unter welchen Umständen ist es akzeptabel/notwendig für einen Move-Konstruktor zu werfen?Wann sollte ich einen Move-Konstruktor ohne noexcept deklarieren?
Antwort
Die goldene Regel hier ist: Es kommt auf. Hier
ist ein Beispiel, wo es Macht Sinn:
// 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...
};
Wenn Sie wirklich keine andere Wahl haben. Die meiste Zeit sollte Ihr Move-Konstruktor noexcept
sein. Und sie sind standardmäßig.
Es ist besonders wichtig noexcept für Typen zu verwenden, die bestimmt sind, mit der Standardbibliothek Behälter verwendet werden. Wenn der Konstruktor move für einen Elementtyp in einem Container nicht "noexcept" ist, dann verwendet der Container den Konstruktor copy anstelle des Konstruktors move .
Können Sie mir ein Beispiel geben, wenn ich keine Wahl habe? – Klaufir
@Klaufir Ich würde vermuten, dass wenn Sie (sagen wir mal) einen Container haben, der atomares Verhalten garantiert (er bewegt sich entweder alle oder bewegt sich nicht) und Ihre Elemente wären nicht kopierbar (wie zum Beispiel handle) - also kein Plan B - dann würde dein Elementtyp nicht funktionieren. –
@Klaufir Es tut mir leid, ich habe kein Beispiel :(. Vielleicht mehr erfahrene ppl kann etwas einfallen lassen. – Xaqq
- 1. Sollte "constexpr" auch "noexcept" sein?
- 2. Wann muss ich session_start(); deklarieren?
- 3. Wann sollte ich :: einen Funktionsaufruf weiterleiten?
- 4. Wann sollte ich einen neuen Zweig erstellen?
- 5. Wann sollte ich __call__
- 6. Wann statische Eigenschaft deklarieren?
- 7. Wann sollte ich einen GET vs einen Link verwenden?
- 8. Wann sollte ich Threads verwenden?
- 9. Wie erstelle ich einen noexcept Funktionszeiger?
- 10. Wann sollte ich RESTful verwenden?
- 11. Wann sollte ich getElementById verwenden?
- 12. Wann sollte ich const & benutzen?
- 13. Wann sollte ich ConcurrentSkipListMap verwenden?
- 14. Wann sollte ich glDeleteBuffers() aufrufen?
- 15. Ist es sinnvoll, eine gelöschte Funktion als noexcept zu deklarieren?
- 16. Sollte ich https in der web.config deklarieren?
- 17. Wann sollte ich einen View-Controller mit initWithNibName initialisieren?
- 18. Wann sollte ich einen Datensatz über ein Tupel verwenden?
- 19. Best Practices: Wann sollte ich einen Delegaten in .NET verwenden?
- 20. Wann sollte ich eine Klasse für einen Map-Schlüssel erstellen?
- 21. Wann sollte ich einen UIViewController in der IOS-Programmierung verwenden?
- 22. Wann sollte ich zwei Fremdschlüssel als einen einzigen Fremdschlüssel kombinieren?
- 23. Wann sollte ich Express.js über einen eigenständigen node.js
- 24. Wie erstelle ich einen Alias für einen noexcept Funktionszeiger?
- 25. Deklarieren Sie eine Variable ohne einen Anfangswert
- 26. Wann sollte StringBuilder verwendet werden?
- 27. Wann ein Variablenproblem zu deklarieren
- 28. Welchen Qualifier sollte ich verwenden, um einen Block als einen Ivar zu deklarieren?
- 29. Wann sollte ich @classmethod und wann def-Methode (self) verwenden?
- 30. Wann sollte ich Klammern in Knockout verwenden
+1, aber bedenken Sie, dass Bewegung eine Optimierung ist. Meiner Meinung nach ist der Wert von R-Werten eines der Dinge, an die man viel zu lange denkt. Der beste Move-Konstruktor, den Sie schreiben können, ist keiner. Ein Wurfbewegungskonstruktor ist keine gute Wahl, aber wenn es Ihre einzige Wahl ist und Ihr Profiling zeigt, dass es eine Verbesserung gegenüber der Kopie auf einem kritischen Pfad ist, dann wäre es schwer, dagegen zu argumentieren. –