std::uninitialized_fill_n
ja.cppreference.net より
| ヘッダ <memory>
|
||
template< class NoThrowForwardIt, class Size, class T >
NoThrowForwardIt uninitialized_fill_n( NoThrowForwardIt first,
Size count, const T& value );
|
で定義 (1) | (C++26 から constexpr) |
template< class ExecutionPolicy,
class NoThrowForwardIt, class Size, class T >
NoThrowForwardIt uninitialized_fill_n( ExecutionPolicy&& policy,
NoThrowForwardIt first,
Size count, const T& value );
|
(2) | (C++17 から) |
1) 最初の
count 個の要素を、first で始まる移動先レンジに、与えられた値 value で、以下のように構築する:
for (; count--; ++first)
::new (voidify(*first))
typename std::iterator_traits<NoThrowForwardIt>::value_type(value);
return first;
初期化中に例外が発生した場合、既に構築されたオブジェクトは未規定の順序で破棄される。
2) (1) と同じだが、
policy に従って実行される。 このオーバーロードは、以下の式の値が
true である場合にのみオーバーロード解決に参加する:
|
|
(C++20 まで) |
|
|
(C++20 から) |
パラメータ
| first | - | 初期化する要素範囲の先頭 |
| count | - | 構築する要素の数 |
| value | - | 要素を構築するための値 |
| 型要件 | ||
-
NoThrowForwardIt
は
LegacyForwardIterator
の要件を満たさなければならない。
|
||
-
NoThrowForwardIt
の有効なインスタンスを通じたインクリメント、代入、比較、間接参照は例外を投げてはならない。
NoThrowForwardIt
値に
&
*
を適用すると、その値型へのポインタが得られなければならない。
(C++11まで)
|
||
戻り値
上記の通り。
例外
2) 実行プロセス中:
- 並列化に必要な一時メモリリソースが利用できない場合、std::bad_allocがスローされます。
- アルゴリズム引数を介してオブジェクトにアクセスしているときにキャッチされない例外がスローされた場合、動作は実行ポリシーによって決まります(標準ポリシーの場合、std::terminateが呼び出されます)。
注釈
| 機能テストマクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_raw_memory_algorithms |
202411L |
(C++26) | constexpr用特殊化された<memory>アルゴリズム, (1)
|
実装例
template<class NoThrowForwardIt, class Size, class T> constexpr NoThrowForwardIt uninitialized_fill_n(NoThrowForwardIt first, Size count, const T& value) { using V = typename std::iterator_traits<NoThrowForwardIt>::value_type; NoThrowForwardIt current = first; try { for (; count > 0; ++current, (void) --count) ::new (static_cast<void*>(std::addressof(*current))) V(value); return current; } catch (...) { for (; first != current; ++first) first->~V(); throw; } return current; } |
例
このコードを実行
#include <algorithm> #include <iostream> #include <memory> #include <string> #include <tuple> int main() { std::string* p; std::size_t sz; std::tie(p, sz) = std::get_temporary_buffer<std::string>(4); std::uninitialized_fill_n(p, sz, "Example"); for (std::string* i = p; i != p + sz; ++i) { std::cout << *i << '\n'; i->~basic_string<char>(); } std::return_temporary_buffer(p); }
出力:
Example Example Example Example
欠陥報告
以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡及的に適用されました。
| DR | 適用先 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 866 | C++98 | T を NoThrowForwardIt の値型として与えた場合、T::operator new が存在すると、プログラムは ill-formed になる可能性がある
|
代わりにグローバル配置 new を使用する
|
| LWG 1339 | C++98 | 塗りつぶし範囲 に続く最初の要素の位置が返されなかった |
返される |
| LWG 2433 | C++11 | このアルゴリズムはオーバーロードされた operator&
|
によって乗っ取られる可能性があるstd::addressof |
関連項目
|
未初期化メモリ領域(範囲で定義される)にオブジェクトをコピーする
(関数テンプレート) |
|
|
(C++20)
|
未初期化メモリ領域(開始位置とカウントで定義される)にオブジェクトをコピーする
(アルゴリズム関数オブジェクト) |