Namespaces
Variants

std:: uninitialized_move_n

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 Size, class NoThrowForwardIt >

std:: pair < InputIt, NoThrowForwardIt >
uninitialized_move_n ( InputIt first, Size count,

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

class ForwardIt, class Size, class NoThrowForwardIt >
std:: pair < ForwardIt, NoThrowForwardIt >
uninitialized_move_n ( ExecutionPolicy && policy, ForwardIt first,

Size count, NoThrowForwardIt d_first ) ;
(2) (depuis C++17)
1) Copie les éléments de first + [ 0 , count ) (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 ( ; count > 0 ; ++ d_first, ( void ) ++ first, -- count )
:: new ( voidify ( * d_first ) )
typename std:: iterator_traits < NoThrowForwardIt > :: value_type ( /* value */ ) ;
return { first, 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 durant l'initialisation, certains objets dans first + [ 0 , count ) 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 uniquement 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 , count ) chevauche first + [ 0 , count ) , le comportement est indéfini.

(depuis C++20)

Table des matières

Paramètres

first - le début de la plage des éléments à déplacer
d_first - le début de la plage de destination
count - le nombre d'éléments à déplacer
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 count .

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_n est identique à std::uninitialized_copy_n .

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 Size, class NoThrowForwardIt>
constexpr std::pair<InputIt, NoThrowForwardIt>
    uninitialized_move_n(InputIt first, Size count, NoThrowForwardIt d_first)
{
    using ValueType = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = d_first;
    try
    {
        for (; count > 0; ++first, (void) ++current, --count) {
            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);
        }
    }
    catch (...)
    {
        std::destroy(d_first, current);
        throw;
    }
    return {first, current};
}
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et ``, et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant aurait été traduit s'il y en avait eu.

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[]{"One", "Definition", "Rule"};
    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_n(std::begin(in), sz, 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: "One" "Definition" "Rule" 
after move, in: "" "" "" 
after move, out: "One" "Definition" "Rule"

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 correct
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

déplace une plage d'objets vers une zone mémoire non initialisée
(modèle de fonction)
copie un nombre 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
(objet fonction algorithme)