namespace std::ranges {
template <class T, class... Args>
constexpr T* construct_at(T* location, Args&&... args); // (1) C++20
}
概要
コンストラクタを呼び出す。
location
の位置に配置newで型T
のコンストラクタを呼び出す。
テンプレートパラメータ制約
- 式
::new (declval<void*>()) T(declval<Args>()...)
が評価されないオペランドとして扱われる場合に、適格であること
効果
以下の関数があるとして、
template<class T>
constexpr void* voidify(T& ptr) noexcept {
return const_cast<void*>(static_cast<const volatile void*>(addressof(ptr)));
}
以下と等価:
auto ptr = ::new (voidify(*location)) T(std::forward<Args>(args)...);
if constexpr (is_array_v<T>)
return launder(location);
else
return ptr;
例
#include <iostream>
#include <memory>
int main()
{
// 配置newでオブジェクトを構築
char storage[4];
int* n = std::ranges::construct_at(reinterpret_cast<int*>(storage));
*n = 314;
std::cout << *n << std::endl;
// デストラクタを呼び出して破棄
std::ranges::destroy_at(n);
}
出力
314
バージョン
言語
- C++20
処理系
- Clang: 16.0 ✅
- GCC: 10.2.0 ✅
- Visual C++: 2019 Update 10 ✅