std::variant<Types...>:: emplace
From cppreference.net
|
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
>
&
|
(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
(публичная функция-член) |