template <class T, class... Args>
decay_t<T>& emplace(Args&&... args); // (1)
template <class T, class U, class... Args>
decay_t<T>& emplace(std::initializer_list<U> il,
Args&&... args); // (2)
概要
要素型のコンストラクタ引数から直接構築する。
- (1) : 任意の型
Tのコンストラクタ引数args...をとり、この関数内部でT型オブジェクトを構築して代入する - (2) : 任意の型
Tのコンストラクタ引数ilとargs...をとり、この関数内部でT型オブジェクトを構築して代入する
テンプレートパラメータ制約
- (1) :
using VT = std::decay_t<T>であるとして、std::copy_constructible<VT>および、std::constructible_from<VT, Args...>を満たすこと
- (2) :
using VT = std::decay_t<T>であるとして、std::copy_constructible<VT>および、std::constructible_from<VT, std::initializer_list<U>&, Args...>を満たすこと
効果
- (1) :
reset()を呼び出す。その後std::forward<Args>(value)...をコンストラクタ引数として、型std::decay_t<T>のオブジェクトを直接構築して保持する - (2) :
reset()を呼び出す。その後ilとstd::forward<Args>(value)...をコンストラクタ引数として、型std::decay_t<T>のオブジェクトを直接構築して保持する
戻り値
- 構築されたオブジェクトへの参照を返す
事後条件
- (1), (2) :
*thisは値を保持した状態となる
例外
- (1), (2) : 型
std::decay_t<T>の選択されたコンストラクタが、任意の例外を送出する可能性がある
例
#include <any>
#include <string>
#include <vector>
#include <cassert>
int main()
{
// (1)
{
std::any x;
// std::string型のオブジェクトを、コンストラクタ引数として3と'z'を渡して構築する
x.emplace<std::string>(3, 'z');
assert(std::any_cast<std::string>(x) == "zzz");
}
// (2)
{
std::allocator<int> alloc;
std::any x;
x.emplace<std::vector<int>>({3, 1, 4}, alloc);
const auto& vec = std::any_cast<const std::vector<int>&>(x);
assert(vec[0] == 3);
assert(vec[1] == 1);
assert(vec[2] == 4);
}
}
出力
バージョン
言語
- C++17
処理系
- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- ICC: ??
- Visual C++: ??