Namespaces
Variants

std::construct_at

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
 
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 de 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 uniquement si toutes les conditions suivantes sont satisfaites :

  • std::is_unbounded_array_v<T> est false.
  • ::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 sizeof...(Args) est non nul, le programme est mal formé.

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éfaut

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

RD 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 les tableaux borné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)