Namespaces
Variants

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

From cppreference.net
Utilities library
template < class T, class ... Args >
T & emplace ( Args && ... args ) ;
(1) (начиная с C++17)
(constexpr начиная с C++20)
template < class T, class U, class ... Args >
T & emplace ( std:: initializer_list < U > il, Args && ... args ) ;
(2) (начиная с C++17)
(constexpr начиная с C++20)
template < std:: size_t I, class ... Args >
std:: variant_alternative_t < I, variant > & emplace ( Args && ... args ) ;
(3) (начиная с C++17)
(constexpr начиная с C++20)
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)
(constexpr начиная с C++20)

Создает новое значение на месте, в существующем variant объекте

1) Эквивалентно emplace < I > ( std:: forward < Args > ( args ) ... ) , где I является индексом (с нулевой базой) T в Types... .
  • Эта перегрузка участвует в разрешении перегрузки только если std:: is_constructible_v < T, Args... > равно true , и T встречается ровно один раз в Types... .
2) Эквивалентно emplace < I > ( il, std:: forward < Args > ( args ) ... ) , где I — это индекс (с нулевой базой) элемента T в Types... .
  • Эта перегрузка участвует в разрешении перегрузки только если std:: is_constructible_v < T, std:: initializer_list < U > & , Args... > равно true , и T встречается ровно один раз в Types... .
3) Сначала уничтожает текущее содержащееся значение (если есть). Затем прямо инициализирует содержащееся значение, как если бы конструировалось значение типа T_I с аргументами std:: forward < Args > ( args ) ... . Если возникает исключение, * this может стать valueless_by_exception .
  • Эта перегрузка участвует в разрешении перегрузки только если std:: is_constructible_v < T_I, Args... > равно true .
  • Ошибка компиляции возникает, если I не меньше чем sizeof... ( Types ) .
4) Сначала уничтожает текущее содержащееся значение (если есть). Затем прямо инициализирует содержащееся значение, как при конструировании значения типа 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 Applied to Behavior as published Correct behavior
P2231R1 C++20 emplace was not constexpr while the required operations can be constexpr in C++20 made constexpr

Смотрите также

присваивает значение variant
(публичная функция-член)