close
Пространства имён
Варианты
Действия

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

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
(1)
template <class T, class... Args> T& emplace(Args&&... args);
(начиная с C++17)
(до C++20)
template <class T, class... Args> constexpr T& emplace(Args&&... args);
(начиная с C++20)
(2)
template <class T, class U, class... Args> T& emplace( std::initializer_list<U> il, Args&&... args );
(начиная с C++17)
(до C++20)
template <class T, class U, class... Args> constexpr T& emplace( std::initializer_list<U> il, Args&&... args );
(начиная с C++20)
(3)
template <std::size_t I, class... Args> std::variant_alternative_t<I, variant>& emplace( Args&&... args );
(начиная с C++17)
(до C++20)
template <std::size_t I, class... Args> constexpr std::variant_alternative_t<I, variant>& emplace( Args&&... args );
(начиная с C++20)
(4)
template <std::size_t I, class U, class... Args> std::variant_alternative_t<I, variant>& emplace( std::initializer_list<U> il, Args&&... args );
(начиная с C++17)
(до C++20)
template <std::size_t I, class U, class... Args> constexpr std::variant_alternative_t<I, variant>& emplace( std::initializer_list<U> il, Args&&... args );
(начиная с 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) Любое исключение, возникающее во время инициализации содержащегося значения.

Пример

#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"); -> Ошибка
}

Вывод:

abc
def
ghi

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
WG не указан C++20 emplace не была constexpr, в то время как необходимые операции
могут быть constexpr в C++20
сделана constexpr

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

присваивает variant
(public функция-элемент) [править]