Namespaces
Variants

std::ranges:: construct_at

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>
Signature d'appel
template < class T, class ... Args >
constexpr T * construct_at ( T * location, Args && ... args ) ;
(depuis C++20)

Crée un objet T initialisé avec les arguments dans args à l'adresse donnée location .

Équivalent à if constexpr ( std:: is_array_v < T > )
return :: new ( voidify  ( * location ) ) T [ 1 ] ( ) ;
else
return :: new ( voidify  ( * location ) ) T ( std:: forward < Args > ( args ) ... ) ;
, sauf que construct_at peut être utilisé dans l'évaluation des expressions constantes (jusqu'à C++26) .

Lorsque construct_at est appelé lors de l'évaluation d'une expression constante expr , location doit pointer soit vers un stockage obtenu par std:: allocator < T > :: allocate soit vers un objet dont la durée de vie a commencé durant l'évaluation de expr .

Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

Si std:: is_array_v < T > est true et sizeof... ( Args ) est différent de zéro, le programme est mal formé.

Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithmes (informellement appelés niebloids ), c'est-à-dire :

Table des matières

Paramètres

location - pointeur vers l'espace de stockage non initialisé sur lequel un objet T sera construit
args... - arguments utilisés pour l'initialisation

Valeur de retour

location

Notes

std::ranges::construct_at se comporte exactement de la même manière que std::construct_at , sauf qu'il est invisible à la recherche dépendante des arguments.

Exemple

#include <iostream>
#include <memory>
struct S
{
    int x;
    float y;
    double z;
    S(int x, float y, double z) : x{x}, y{y}, z{z} { std::cout << "S::S();\n"; }
    ~S() { std::cout << "S::~S();\n"; }
    void print() const
    {
        std::cout << "S { x=" << x << "; y=" << y << "; z=" << z << "; };\n";
    }
};
int main()
{
    alignas(S) unsigned char buf[sizeof(S)];
    S* ptr = std::ranges::construct_at(reinterpret_cast<S*>(buf), 42, 2.71828f, 3.1415);
    ptr->print();
    std::ranges::destroy_at(ptr);
}

Sortie :

S::S();
S { x=42; y=2.71828; z=3.1415; };
S::~S();

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 Applicable à Comportement publié Comportement corrigé
LWG 3436 C++20 construct_at ne pouvait pas créer d'objets de types tableau peut initialiser par valeur les tableaux bornés
LWG 3870 C++20 construct_at pouvait créer des objets de types qualifiés cv seuls les types non qualifiés cv sont autorisés

Voir aussi

détruit un objet à une adresse donnée
(objet fonction algorithme)
crée un objet à une adresse donnée
(modèle de fonction)