Namespaces
Variants

std::ranges::construct_at

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de modificación de secuencia
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
 
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 T objeto 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 usarse en la evaluación de expresiones constantes(hasta C++26).

Cuando se llama a construct_at en la evaluación de alguna expresión constante expr, location debe apuntar ya sea 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:

  • std::is_unbounded_array_v<T> es false.
  • ::new(std::declval<void*>()) T(std::declval<Args>()...) está bien formada cuando se trata como un operando no evaluado.

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 objetos función de algoritmo (informalmente conocidos como niebloids), es decir:

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 estándares C++ publicados anteriormente.

DR Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 3436 C++20 construct_at no podía crear objetos de tipos array puede inicializar por valor arrays acotados

Véase también

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