- memory[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp20[meta cpp]
namespace std {
template<class T, class A>
shared_ptr<T> allocate_shared_default_init(const A& a); // (1)
template<class T, class A>
shared_ptr<T> allocate_shared_default_init(const A& a, size_t N); // (2)
}
- shared_ptr[link shared_ptr.md]
デフォルトの初期値を持つT
型のオブジェクト、またはその配列へのshared_ptr
を構築し、返却する。
テンプレートパラメータA
はCpp17Allocator
の要件を満たす。
型T
のオブジェクトにメモリを割り当てる(T
がU[]
の場合はU[N]
。N
はそれぞれのオーバーロードで指定された引数から決定される)。メモリは、引数a
のコピー(参照カウンタと型T
の本体を連続メモリ領域に配置するためにはT
のサイズより大きい領域をアロケートする必要があるためにallocator_traits<Alloc>::rebind_alloc<value_type>
を用いて再束縛されたもの)を使用して割り当てられる。
オブジェクトは、デフォルト初期化される。
例外がスローされた場合、関数は効果がない。
配列型U
のオブジェクトが(同じ型の)u
の初期値を持つように指定されている場合、これは、オブジェクトの各配列要素が初期値としてu
からの対応する要素を持つことを意味すると解釈される。
配列タイプのオブジェクトがデフォルトの初期値を持つように指定されている場合、これはオブジェクトの各配列要素がデフォルトの初期値を持つことを意味すると解釈される。
配列要素は、アドレスの昇順で初期化される。
戻り値によって管理されるオブジェクトのlifetime
が終了するか、配列要素の初期化が例外をスローすると、初期化された要素は元の構造の逆の順序で破棄される。
- (1) : このオーバーロードが選択されるとき、
T
は、不明な境界の配列ではない。T
型のオブジェクトへのshared_ptr
を返す。 - (2) : このオーバーロードが選択されるとき、
T
は、不明な境界の配列である。型U[N]
のオブジェクトへのshared_ptr
を返す。ここで、U
はremove_extent_t<T>
である。
新しく構築されたオブジェクトのアドレスを格納および所有するshared_ptr
インスタンス。
r.get() != 0 && r.use_count() == 1
, ここで、r
は戻り値である。
bad_alloc
、またはallocate
またはオブジェクトの初期化からスローされた例外。
同様の効果を持つ関数に、make_shared_default_init()
があるが、
この関数はメモリの確保にユーザー定義のアロケータを使用したい場合などに用いることができる。
#include <memory>
#include <iostream>
int main() {
std::allocator<int> alloc;
std::shared_ptr<int> sp = std::allocate_shared_default_init<int>(alloc);
if (sp) {
std::cout << *sp << std::endl;
}
}
- std::allocate_shared_default_init[color ff0000]
42
- C++20
- Clang: 10.0.0 現在未対応
- GCC: 10.0.0 現在未対応
- Visual C++: ??