Namensräume
Varianten
Aktionen

std::move_if_noexcept

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)  
(C++20)
Swap und Typ-Operationen
(C++14)
(C++11)
(C++11)
(C++11)
move_if_noexcept
(C++11)
(C++17)
Gemeinsame Vokabulartypen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
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

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) [edit]
(C++11)
konvertiert das Argument in ein xvalue
(Funktionsvorlage) [edit]