- optional[meta header]
- std[meta namespace]
- optional[meta class]
- function template[meta id-type]
- cpp17[meta cpp]
template <class... Args>
T& emplace(Args&&... args); // (1) C++17
template <class... Args>
constexpr T& emplace(Args&&... args); // (1) C++23
template <class U, class... Args>
T& emplace(std::initializer_list<U> il, Args&&... args); // (2) C++17
template <class U, class... Args>
constexpr T& emplace(std::initializer_list<U> il, Args&&... args); // (2) C++23要素型のコンストラクタ引数から直接構築する。
- (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;
}
}
}- emplace[color ff0000]
- p.value()[link value.md]
(1) : AAA
(2) :
3
1
4
- C++17
- Clang: 4.0.1
- GCC: 7.2
- ICC: ??
- Visual C++: ??