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++: ??