Namespaces
Variants

std:: uninitialized_move

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Défini dans l'en-tête <memory>
template < class InputIt, class NoThrowForwardIt >

NoThrowForwardIt uninitialized_move ( InputIt first, InputIt last,

NoThrowForwardIt d_first ) ;
(1) (depuis C++17)
(constexpr depuis C++26)
template < class ExecutionPolicy,

class ForwardIt, class NoThrowForwardIt >
NoThrowForwardIt uninitialized_move ( ExecutionPolicy && policy,
ForwardIt first, ForwardIt last,

NoThrowForwardIt d_first ) ;
(2) (depuis C++17)
1) Copie les éléments de [ first , last ) (en utilisant la sémantique de déplacement si supportée) vers une zone mémoire non initialisée commençant à d_first comme suit :

for ( ; first ! = last ; ++ d_first, ( void ) ++ first )
:: new ( voidify ( * d_first ) )
typename std:: iterator_traits < NoThrowForwardIt > :: value_type ( /* value */ ) ;
return d_first ;

/* value */ est std :: move ( * first ) si * first est d'un type référence lvalue, ou * first sinon.
Si une exception est levée pendant l'initialisation, certains objets dans [ first , last ) sont laissés dans un état valide mais non spécifié, et les objets déjà construits sont détruits dans un ordre non spécifié.
2) Identique à (1) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)


Si d_first + [ 0 , std:: distance ( first, last ) ) chevauche [ first , last ) , le comportement est indéfini.

(depuis C++20)

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant l'intervalle des éléments à déplacer
d_first - le début de l'intervalle de destination
policy - la politique d'exécution à utiliser
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
NoThrowForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
Aucun incrément, assignation, comparaison ou indirection via des instances valides de NoThrowForwardIt ne peut lever d'exceptions.

Valeur de retour

Comme décrit ci-dessus.

Complexité

Linéaire en fonction de la distance entre first et last .

Exceptions

La surcharge avec un paramètre de modèle nommé ExecutionPolicy signale les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Notes

Lorsque l'itérateur d'entrée déréférence une rvalue, le comportement de std::uninitialized_move est identique à std::uninitialized_copy .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr pour les algorithmes de mémoire spécialisés , ( 1 )

Implémentation possible

template<class InputIt, class NoThrowForwardIt>
constexpr NoThrowForwardIt uninitialized_move(InputIt first, InputIt last,
                                              NoThrowForwardIt d_first)
{
    using ValueType = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    auto current = d_first;
    try
    {
        for (; first != last; ++first, (void) ++current)
        {
            auto addr = static_cast<void*>(std::addressof(*current));
            if constexpr (std::is_lvalue_reference_v<decltype(*first)>)
                ::new (addr) ValueType(std::move(*first));
            else
                ::new (addr) ValueType(*first);
        }
        return current;
    }
    catch (...)
    {
        std::destroy(d_first, current);
        throw;
    }
}

Exemple

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <memory>
#include <string>
void print(auto rem, auto first, auto last)
{
    for (std::cout << rem; first != last; ++first)
        std::cout << std::quoted(*first) << ' ';
    std::cout << '\n';
}
int main()
{
    std::string in[]{"Home", "Work!"};
    print("initially, in: ", std::begin(in), std::end(in));
    if (
        constexpr auto sz = std::size(in);
        void* out = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz))
    {
        try
        {
            auto first{static_cast<std::string*>(out)};
            auto last{first + sz};
            std::uninitialized_move(std::begin(in), std::end(in), first);
            print("after move, in: ", std::begin(in), std::end(in));
            print("after move, out: ", first, last);
            std::destroy(first, last);
        }
        catch (...)
        {
            std::cout << "Exception!\n";
        }
        std::free(out);
    }
}

Sortie possible :

initially, in: "Home" "Work!"
after move, in: "" ""
after move, out: "Home" "Work!"

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 3870 C++20 cet algorithme pourrait créer des objets sur un const stockage maintenu interdit
LWG 3918 C++17 une matérialisation temporaire supplémentaire était requise
lorsque l'itérateur d'entrée déréférence vers une prvalue
copie l'élément dans ce cas

Voir aussi

copie une plage d'objets vers une zone mémoire non initialisée
(modèle de fonction)
déplace un nombre d'objets vers une zone mémoire non initialisée
(modèle de fonction)
déplace une plage d'objets vers une zone mémoire non initialisée
(objet fonction algorithme)