template <class... Args>
T& emplace(Args&&... args); // (1)
template <class U, class... Args>
T& emplace(std::initializer_list<U> il, Args&&... args); // (2)
概要
要素型のコンストラクタ引数から直接構築する。
- (1) : 可変個の引数をとり、それを型
T
のコンストラクタ引数として渡して、この関数内で型T
の有効値を構築して保持する - (2) : 初期化子リストと可変個の引数をとり、それらを型
T
のコンストラクタ引数として渡して、この関数内で型T
の有効値を構築して保持する
要件
- (1) :
is_constructible_v<T, Args&&...> == true
であること
効果
まず、共通の動作として、reset()
メンバ関数を呼び出す。
- (1) : 型
T
の有効値を、std::forward<Args>(args)...
を引数として構築する - (2) : 型
T
の有効値を、ilとstd::forward<Args>(args)...
を引数として構築する
戻り値
代入された有効値への参照を返す。
例外
型T
の選択されたコンストラクタが、任意の例外を送出する可能性がある。
例外安全性
型T
のコンストラクタが例外を送出した場合、*this
は有効値を含まない状態となり、元々保持していた有効値は破棄される。
備考
- (2) : このオーバーロードは主に、コンテナをアロケータ付きで、初期化子リスト代入するためにある
例
#include <iostream>
#include <optional>
#include <string>
#include <vector>
int main()
{
// (1)
{
std::optional<std::string> p;
// std::stringのコンストラクタ引数を渡して、
// emplace関数内でstringオブジェクトを構築する。
p.emplace(3, 'A');
std::cout << "(1) : " << p.value() << std::endl;
}
// (2)
{
std::optional<std::vector<int>> p;
// 初期化子リストとアロケータから、
// emplace関数内でvectorオブジェクトを構築する。
std::allocator<int> alloc;
p.emplace({3, 1, 4}, alloc);
std::cout << "(2) :" << std::endl;
for (int x : p.value()) {
std::cout << " " << x << std::endl;
}
}
}
出力
(1) : AAA
(2) :
3
1
4
バージョン
言語
- C++17
処理系
- Clang: 4.0.1
- GCC: 7.2
- ICC: ??
- Visual C++: ??