std::construct_at() algorithm
- od C++20
// (1)
template< class T, class... Args >
constexpr T* construct_at( T* p, Args&&... args );
Creates a T
object initialized with arguments args...
at given address p
.
return ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...);
Except that construct_at
may be used in evaluation of constant expressions.
When construct_at
is called in the evaluation of some constant expression e
, the argument p
must point to either storage obtained by std::allocator<T>::allocate
or an object whose lifetime began within the evaluation of e
.
Overload Resolution
Participates in overload resolution only if ::new(std::declval<void*>()) T(std::declval<Args>()...)
is well-formed in unevaluated context.
Parameters
p | Pointer to the uninitialized storage on which a |
args.. | Args to initialize the object with. |
Return value
p
(none)
Complexity
O(1)
Exceptions
(none)
Examples
Main.cpp
#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 storage[sizeof(S)];
S* ptr = std::construct_at(reinterpret_cast<S*>(storage), 42, 2.71828f, 3.1415);
ptr->print();
std::destroy_at(ptr);
}
Output
S::S();
S { x=42; y=2.71828; z=3.1415; };
S::~S();
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.
Hover to see the original license.