Namespaces
Variants

std::construct_at

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
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)

Operaciones de ordenación y relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (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>
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 construct_at se llama 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 ciclo 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.

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

Ejemplo

#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() {}

Informes de defectos

Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a estándares C++ previamente publicados.

DR Aplicado a Comportamiento según publicación 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

asigna almacenamiento no inicializado
(función miembro pública de std::allocator<T> )
[static]
construye un objeto en el almacenamiento asignado
(plantilla de función)
(C++17)
destruye un objeto en una dirección dada
(plantilla de función)
crea un objeto en una dirección dada
(objeto función de algoritmo)