Namespaces
Variants

std::variant<Types...>:: emplace

From cppreference.net
Utilities library
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 > &

emplace ( std:: initializer_list < U > il, Args && ... args ) ;
(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から始まるインデックスである。
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 を代入
(公開メンバ関数)