Namespaces
Variants

std:: move_if_noexcept

From cppreference.net
Utilities library
Défini dans l'en-tête <utility>
template < class T >
/* voir ci-dessous */ move_if_noexcept ( T & x ) noexcept ;
(depuis C++11)
(constexpr depuis C++14)

std::move_if_noexcept obtient une référence rvalue à son argument si son constructeur de déplacement ne lève pas d'exceptions ou s'il n'y a pas de constructeur de copie (type à déplacement uniquement), sinon obtient une référence lvalue à son argument. Il est généralement utilisé pour combiner la sémantique de déplacement avec la garantie d'exception forte.

Le type de retour de std::move_if_noexcept est :

Table des matières

Paramètres

x - l'objet à déplacer ou copier

Valeur de retour

std :: move ( x ) ou x , selon les garanties d'exception.

Complexité

Constante.

Notes

Ceci est utilisé, par exemple, par std::vector::resize , qui peut devoir allouer un nouveau stockage puis déplacer ou copier les éléments de l'ancien stockage vers le nouveau. Si une exception se produit pendant cette opération, std::vector::resize annule tout ce qu'il a fait jusqu'à présent, ce qui n'est possible que si std::move_if_noexcept a été utilisé pour décider d'utiliser la construction par déplacement ou la construction par copie (sauf si le constructeur de copie n'est pas disponible, auquel cas le constructeur de déplacement est utilisé dans tous les cas et la garantie d'exception forte peut être levée).

Exemple

#include <iostream>
#include <utility>
struct Bad
{
    Bad() {}
    Bad(Bad&&) // peut lever une exception
    {
        std::cout << "Throwing move constructor called\n";
    }
    Bad(const Bad&) // peut également lever une exception
    {
        std::cout << "Throwing copy constructor called\n";
    }
};
struct Good
{
    Good() {}
    Good(Good&&) noexcept // ne lèvera PAS d'exception
    {
        std::cout << "Non-throwing move constructor called\n";
    }
    Good(const Good&) noexcept // ne lèvera PAS d'exception
    {
        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);
}

Sortie :

Non-throwing move constructor called
Throwing copy constructor called

Voir aussi

(C++11)
transmet un argument de fonction et utilise l'argument de type template pour préserver sa catégorie de valeur
(modèle de fonction)
(C++11)
convertit l'argument en xvalue
(modèle de fonction)