std::variant<Types...>::emplace
Материал из cppreference.com
<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 функция-элемент) |