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/w/cpp/container/stack/emplace