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)
Definido en el encabezado <memory>
Firma de llamada
template < class T, class ... Args >
constexpr T * construct_at ( T * location, Args && ... args ) ;
(desde C++20)

Crea un objeto T inicializado con los argumentos en args en la dirección dada location .

Equivalente a if constexpr ( std:: is_array_v < T > )
return :: new ( voidify  ( * location ) ) T [ 1 ] ( ) ;
else
return :: new ( voidify  ( * location ) ) T ( std:: forward < Args > ( args ) ... ) ;
, excepto que construct_at puede utilizarse en la evaluación de expresiones constantes (hasta C++26) .

Cuando construct_at es llamado en la evaluación de alguna expresión constante expr , location debe apuntar a un almacenamiento obtenido por std:: allocator < T > :: allocate o a un objeto cuyo tiempo de vida comenzó dentro de la evaluación de expr .

Esta sobrecarga participa en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:

Si std:: is_array_v < T > es true y sizeof... ( Args ) es distinto de cero, el programa está mal formado.

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

location - puntero al almacenamiento no inicializado donde se construirá un objeto T
args... - argumentos utilizados para la inicialización

Valor de retorno

location

Notas

std::ranges::construct_at se comporta exactamente igual que std::construct_at , excepto que es invisible a la búsqueda dependiente de argumentos.

Ejemplo

#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);
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 3436 C++20 construct_at no podía crear objetos de tipos array puede inicializar por valor arrays acotados
LWG 3870 C++20 construct_at podía crear objetos de tipos calificados cv solo se permiten tipos no calificados cv

Véase también

destruye un objeto en una dirección dada
(objeto función algoritmo)
crea un objeto en una dirección dada
(plantilla de función)