Namensräume
Varianten
Aktionen

std::move_if_noexcept

Aus cppreference.com
< cpp‎ | utility

Defined in header <utility>
template< class T >

typename std::conditional<  
    !std::is_nothrow_move_constructible<T>::value && std::is_copy_constructible<T>::value,
    const T&,
    T&&

>::type move_if_noexcept(T& x);
(seit C++11)
move_if_noexcept erhält eine rvalue Bezug auf das Argument, wenn der Umzug Konstruktor nicht werfen keine Ausnahmen, sonst erhält eine lvalue Bezug auf ihr Argument. Es wird normalerweise verwendet, um Bewegung Semantik mit starken Ausnahme Garantie kombinieren .
Original:
move_if_noexcept obtains an rvalue reference to its argument if its move constructor does not throw exceptions, otherwise obtains an lvalue reference to its argument. It is typically used to combine move semantics with strong exception guarantee.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Zum Beispiel, std::vector::resize gelegentlich ordnet neue Speicher und dann verschiebt oder kopiert Elemente aus alten Speicher auf neue Speichermedien. Wenn eine Ausnahme auftritt während dieser Operation rückgängig gemacht std::vector::resize alles, was es zu diesem Punkt, was nur möglich ist, wenn std::move_if_noexcept wurde verwendet, um zu entscheiden, ob die Bewegung Bau oder Kopie Konstruktion verwenden hat .
Original:
For example, std::vector::resize occasionally allocates new storage and then moves or copies elements from old storage to new storage. If an exception occurs during this operation, std::vector::resize undoes everything it did to this point, which is only possible if std::move_if_noexcept was used to decide whether to use move construction or copy construction.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Inhaltsverzeichnis

[Bearbeiten] Parameter

x -
das Objekt bewegt oder kopiert werden
Original:
the object to be moved or copied
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[Bearbeiten] Rückgabewert

std::move(x) oder x je Ausnahme garantiert .
Original:
std::move(x) or x, depending on exception guarantees.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[Bearbeiten] Ausnahmen

noexcept specification:  
noexcept
  (seit C++11)

[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&) {};
};
 
int main()
{
    Good g;
    Bad b;
    Good g2 = std::move_if_noexcept(g);
    Bad b2 = std::move_if_noexcept(b);
}

Output:

Non-throwing move constructor called
Throwing copy constructor called

[Bearbeiten] Komplexität

Constant
Original:
Constant
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[Bearbeiten] Siehe auch

(C++11)
leitet eine Funktion Argument
Original:
forwards a function argument
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(Funktions-Template) [edit]
(C++11)
erhält einen rvalue Referenz
Original:
obtains an rvalue reference
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(Funktions-Template) [edit]