Namespaces
Variants

std:: move_if_noexcept

From cppreference.net
Utilities library
Definiert im Header <utility>
template < class T >
/* siehe unten */ move_if_noexcept ( T & x ) noexcept ;
(seit C++11)
(constexpr seit C++14)

std::move_if_noexcept erhält einen Rvalue-Referenz auf sein Argument, wenn sein Move-Konstruktor keine Ausnahmen wirft oder wenn kein Copy-Konstruktor vorhanden ist (Move-Only-Typ), andernfalls erhält es eine Lvalue-Referenz auf sein Argument. Es wird typischerweise verwendet, um Move-Semantik mit starker Ausnahmesicherheit zu kombinieren.

Der Rückgabetyp von std::move_if_noexcept ist:

Inhaltsverzeichnis

Parameter

x - das zu verschiebende oder zu kopierende Objekt

Rückgabewert

std :: move ( x ) oder x , abhängig von Ausnahmegarantien.

Komplexität

Konstante.

Hinweise

Dies wird beispielsweise verwendet von std::vector::resize , was möglicherweise neuen Speicher allozieren und dann Elemente vom alten Speicher in den neuen Speicher verschieben oder kopieren muss. Wenn während dieser Operation eine Exception auftritt, std::vector::resize macht alles rückgängig, was bis zu diesem Punkt getan wurde, was nur möglich ist, wenn std::move_if_noexcept verwendet wurde, um zu entscheiden, ob Move-Konstruktion oder Copy-Konstruktion verwendet werden soll (es sei denn, der Copy-Konstruktor ist nicht verfügbar, in welchem Fall der Move-Konstruktor ohnehin verwendet wird und die starke Exception-Garantie möglicherweise nicht gewährleistet wird).

Beispiel

#include <iostream>
#include <utility>
struct Bad
{
    Bad() {}
    Bad(Bad&&) // kann werfen
    {
        std::cout << "Throwing move constructor called\n";
    }
    Bad(const Bad&) // kann ebenfalls werfen
    {
        std::cout << "Throwing copy constructor called\n";
    }
};
struct Good
{
    Good() {}
    Good(Good&&) noexcept // wird NICHT werfen
    {
        std::cout << "Non-throwing move constructor called\n";
    }
    Good(const Good&) noexcept // wird NICHT werfen
    {
        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

Siehe auch

(C++11)
leitet ein Funktionsargument weiter und verwendet den Typ-Template-Parameter, um seine Wertkategorie zu erhalten
(Funktions-Template)
(C++11)
konvertiert das Argument in einen xvalue
(Funktions-Template)