std::ranges::construct_at
| 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 T objet initialisé avec les arguments de 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 d'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é dans l'évaluation de expr.
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :
std::is_unbounded_array_v<T>estfalse.::new(std::declval<void*>()) T(std::declval<Args>()...)est bien formé lorsqu'il est traité comme un opérande non évalué.
Si std::is_array_v<T> est true et que sizeof...(Args) est non nul, le programme est mal formé.
Les entités de type fonction décrites sur cette page sont des objets fonctions algorithmes (informellement appelés niebloids), c'est-à-dire :
- Les listes d'arguments de modèle explicites ne peuvent pas être spécifiées lors de leur appel.
- Aucun d'entre eux n'est visible par recherche dépendante des arguments.
- Lorsque l'un d'entre eux est trouvé par recherche non qualifiée normale comme le nom à gauche de l'opérateur d'appel de fonction, recherche dépendante des arguments est inhibée.
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 | Appliqué à | Comportement publié | Comportement correct |
|---|---|---|---|
| LWG 3436 | C++20 | construct_at ne pouvait pas créer d'objets de types tableau |
peut initialiser par valeur des tableaux bornés |
Voir aussi
(C++20) |
détruit un objet à une adresse donnée (objet fonction d'algorithme) |
(C++20) |
crée un objet à une adresse donnée (modèle de fonction) |