namespace std {
template<class T>
unique_ptr<T> make_unique_for_overwrite(); // (1) C++20
template<class T>
constexpr unique_ptr<T> make_unique_for_overwrite(); // (1) C++23
template<class T>
unique_ptr<T> make_unique_for_overwrite(size_t n); // (2) C++20
template<class T>
constexpr unique_ptr<T> make_unique_for_overwrite(size_t n); // (2) C++23
template<class T, class... Args>
unspecified make_unique_for_overwrite(Args&&...) = delete; // (3)
}
概要
unique_ptr
オブジェクトを構築する。その際、型T
のオブジェクトはデフォルト構築される。
- (1) :
T
が配列型でないときに選択される。 - (2) :
T
が要素数不明の配列型のときに選択される。 - (3) : 許可されていないオーバーロードとして宣言される。
T
は要素数既知の配列型である。
テンプレートパラメータ制約
- (1) :
T
は配列型ではない - (2) :
T
は要素数不明の配列型(U[]
) - (3) :
T
は要素数既知の配列型(U[N]
)
戻り値
- (1) :
unique_ptr<T>(new T)
- (2) :
unique_ptr<T>(new remove_extent_t<T>[n])
備考
デフォルト構築においては、トリビアルにデフォルト構築可能な型のオブジェクトは未初期化状態となるため、値を読みだす前に明示的に初期化(overwrite)する必要がある。初期化後の状態が不定になってほしくない場合はこの関数ではなくmake_unique()
を使用すべき。
例
#include <iostream>
#include <memory>
int main()
{
std::unique_ptr<int> i1 = std::make_unique_for_overwrite<int>();
// 必ず初期化する
*i1 = 0;
std::cout << *i1 << std::endl;
}
xxxxxxxxxx
#include <iostream>
#include <memory>
int main()
{
std::unique_ptr<int> i1 = std::make_unique_for_overwrite<int>();
// 必ず初期化する
*i1 = 0;
std::cout << *i1 << std::endl;
}
出力
0
バージョン
言語
- C++20
処理系
- Clang: 10.0.0 現在未対応 ✅
- GCC: 10.0.0 現在未対応 ✅
- Visual C++: ??