Namespaces
Variants

std:: 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>
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é dans 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 que sizeof... ( Args ) est différent de zéro, le programme est mal formé.

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

Exemple

#include <bit>
#include <memory>
class S
{
    int x_;
    float y_;
    double z_;
public:
    constexpr S(int x, float y, double z) : x_{x}, y_{y}, z_{z} {}
    [[nodiscard("no side-effects!")]]
    constexpr bool operator==(const S&) const noexcept = default;
};
consteval bool test()
{
    alignas(S) unsigned char storage[sizeof(S)]{};
    S uninitialized = std::bit_cast<S>(storage);
    std::destroy_at(&uninitialized);
    S* ptr = std::construct_at(std::addressof(uninitialized), 42, 2.71f, 3.14);
    const bool res{*ptr == S{42, 2.71f, 3.14}};
    std::destroy_at(ptr);
    return res;
}
static_assert(test());
int main() {}

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

alloue de la mémoire non initialisée
(fonction membre publique de std::allocator<T> )
[static]
construit un objet dans la mémoire allouée
(fonction template)
(C++17)
détruit un objet à une adresse donnée
(fonction template)
crée un objet à une adresse donnée
(objet fonction algorithme)