std::move_if_noexcept
| Definiert in der Header-Datei <utility> |
||
template< class T > /* siehe unten */ move_if_noexcept( T& x ) noexcept; |
(seit C++11) (constexpr seit C++14) |
|
std::move_if_noexcept gibt einen rvalue-Referenz auf sein Argument zurück, wenn dessen Move-Konstruktor keine Ausnahmen auslöst oder wenn kein Copy-Konstruktor vorhanden ist (nur-Move-Typ). Andernfalls gibt es eine lvalue-Referenz auf sein Argument zurück. Es wird typischerweise verwendet, um Move-Semantik mit starker Ausnahme-Garantie zu kombinieren.
Der Rückgabetyp von std::move_if_noexcept ist
- T&& wenn std::is_nothrow_move_constructible<T>::value || !std::is_copy_constructible<T>::value true ist.
- Andernfalls const T&.
Inhalt |
[bearbeiten] Parameter
| x | - | das Objekt, das verschoben oder kopiert werden soll |
[bearbeiten] Rückgabewert
std::move(x) oder x, abhängig von den Ausnahme-Garantien.
[bearbeiten] Komplexität
Konstant.
[bearbeiten] Hinweise
Dies wird zum Beispiel von std::vector::resize verwendet, das möglicherweise neuen Speicher zuweisen und Elemente vom alten in den neuen Speicher verschieben oder kopieren muss. Wenn während dieser Operation eine Ausnahme auftritt, macht std::vector::resize alles bisherige rückgängig, was nur möglich ist, wenn std::move_if_noexcept verwendet wurde, um zu entscheiden, ob Move-Konstruktion oder Kopier-Konstruktion verwendet werden soll (es sei denn, der Kopier-Konstruktor ist nicht verfügbar, in welchem Fall der Move-Konstruktor sowieso verwendet wird und die starke Ausnahme-Garantie aufgehoben werden kann).
[bearbeiten] Beispiel
#include <iostream> #include <utility> struct Bad { Bad() {} Bad(Bad&&) // may throw { std::cout << "Throwing move constructor called\n"; } Bad(const Bad&) // may throw as well { std::cout << "Throwing copy constructor called\n"; } }; struct Good { Good() {} Good(Good&&) noexcept // will NOT throw { std::cout << "Non-throwing move constructor called\n"; } Good(const Good&) noexcept // will NOT throw { std::cout << "Non-throwing copy constructor called\n"; } }; int main() { Good g; Bad b; [[maybe_unused]] Good g2 = std::move_if_noexcept(g); [[maybe_unused]] Bad b2 = std::move_if_noexcept(b); }
Ausgabe
Non-throwing move constructor called Throwing copy constructor called
[bearbeiten] Siehe auch
| (C++11) |
leitet ein Funktionsargument weiter und verwendet das Typ-Template-Argument, um seine Wertkategorie zu erhalten (Funktionsvorlage) |
| (C++11) |
konvertiert das Argument in ein xvalue (Funktionsvorlage) |