std::variant<Types...>:: emplace
From cppreference.net
|
template
<
class
T,
class
...
Args
>
T & emplace ( Args && ... args ) ; |
(1) |
(C++17以降)
(C++20以降constexpr) |
|
template
<
class
T,
class
U,
class
...
Args
>
T & emplace ( std:: initializer_list < U > il, Args && ... args ) ; |
(2) |
(C++17以降)
(C++20以降constexpr) |
|
template
<
std::
size_t
I,
class
...
Args
>
std:: variant_alternative_t < I, variant > & emplace ( Args && ... args ) ; |
(3) |
(C++17以降)
(C++20以降constexpr) |
|
template
<
std::
size_t
I,
class
U,
class
...
Args
>
std::
variant_alternative_t
<
I, variant
>
&
|
(4) |
(C++17以降)
(C++20以降constexpr) |
既存の
variant
オブジェクト内で、新しい値をその場で作成します
1)
T
が
Types...
内でゼロから始まるインデックス
I
である場合、
emplace
<
I
>
(
std::
forward
<
Args
>
(
args
)
...
)
と等価。
-
このオーバーロードは、
std::
is_constructible_v
<
T, Args...
>
が
true
であり、かつ
TがTypes...内に一度だけ現れる場合にのみ、オーバーロード解決に参加する。
2)
次と同等:
emplace
<
I
>
(
il,
std::
forward
<
Args
>
(
args
)
...
)
。ここで
I
は
Types...
内の
T
の0から始まるインデックスである。
-
このオーバーロードは、
std::
is_constructible_v
<
T,
std::
initializer_list
<
U
>
&
, Args...
>
が
true
であり、かつ
TがTypes...内に正確に1回だけ現れる場合にのみ、オーバーロード解決に参加する。
3)
まず、現在保持されている値(存在する場合)を破棄します。その後、
direct-initializes
によって、型
T_I
の値を引数
std::
forward
<
Args
>
(
args
)
...
で構築するかのように包含された値を初期化します。例外がスローされた場合、
*
this
は
valueless_by_exception
状態になる可能性があります。
- このオーバーロードは、 std:: is_constructible_v < T_I, Args... > が true の場合にのみオーバーロード解決に参加します。
-
Iが sizeof... ( Types ) 以上の場合、コンパイル時エラーとなります。
4)
まず、現在保持されている値(存在する場合)を破棄します。その後、
direct-initializes
を用いて、型
T_I
の値を引数
il,
std::
forward
<
Args
>
(
args
)
...
で構築するかのように、保持する値を直接初期化します。例外がスローされた場合、
*
this
は
valueless_by_exception
状態になる可能性があります。
- このオーバーロードは、 std:: is_constructible_v < T_I, std:: initializer_list < U > & , Args... > が true の場合にのみ、オーバーロード解決に参加します。
-
Iが sizeof... ( Types ) 以上の場合、コンパイル時エラーとなります。
目次 |
パラメータ
| args | - | 新しい値を構築する際に使用するコンストラクタ引数 |
| il | - | 新しい値を構築する際に使用するinitializer_list引数 |
戻り値
新しい格納値への参照。
例外
1-4)
格納されている値の初期化中にスローされたあらゆる例外。
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_variant
|
202106L
|
(C++20)
(DR) |
完全な
constexpr
std::variant
(
1-4
)
|
例
このコードを実行
#include <iostream> #include <string> #include <variant> int main() { std::variant<std::string> v1; v1.emplace<0>("abc"); // OK std::cout << std::get<0>(v1) << '\n'; v1.emplace<std::string>("def"); // OK std::cout << std::get<0>(v1) << '\n'; std::variant<std::string, std::string> v2; v2.emplace<1>("ghi"); // OK std::cout << std::get<1>(v2) << '\n'; // v2.emplace<std::string>("abc"); -> Error }
出力:
abc def ghi
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2231R1 | C++20 |
emplace
は
constexpr
ではなかったが、C++20では必要な操作が
constexpr
化可能
|
constexpr 化 |
関連項目
variant
を代入
(公開メンバ関数) |