std::stack<T,Container>::emplace
template< class... Args > void emplace( Args&&... args ); |
(начиная с C++11) (до C++17) | |
template< class... Args > decltype(auto) emplace( Args&&... args ); | (начиная с C++17) |
Помещает новый элемент на вершину стека. Элемент конструируется на месте, то есть операции копирования и перемещения не выполняются. Конструктор элемента вызывается с теми же аргументами, которые переданы функции.
Фактически вызывает c.emplace_back(std::forward<Args>(args)...);.
Параметры
| args | - | аргументы, передаваемые конструктору элемента |
Возвращаемое значение
| нет | (до C++17) |
| Значение или ссылка, если таковые имеются, возвращаемые приведённым выше вызовом | (начиная с C++17) |
Сложность
Такая же, как сложность Container::emplace_back.
Пример
#include <iostream>
#include <stack>
struct S
{
int id;
S(int i, double d, std::string s) : id{i}
{
std::cout << "S::S(" << i << ", " << d << ", \"" << s << "\");\n";
}
};
int main()
{
std::stack<S> stack;
const S& s = stack.emplace(42, 3.14, "C++"); // for return value C++17 required
std::cout << "id = " << s.id << '\n';
}
Вывод:
S::S(42, 3.14, "C++") id = 42
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 2783 | C++17 |
emplace возвращал reference, нарушая совместимость с контейнерами до C++17 | возвращает decltype(auto) |
См. также
| вставляет элемент на вершину (открытая функция-член) |
|
| удаляет верхний элемент (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/stack/emplace