Namespaces
Variants

std::list<T,Allocator>:: emplace

From cppreference.net

template < class ... Args >
iterator emplace ( const_iterator pos, Args && ... args ) ;
(начиная с C++11)
(constexpr начиная с C++26)

Вставляет новый элемент в контейнер непосредственно перед pos .

Элемент создаётся с помощью std::allocator_traits::construct , который использует размещающий new для создания элемента на месте в памяти, предоставленной контейнером.

Аргументы args... передаются конструктору как std:: forward < Args > ( args ) ... . args... могут прямо или косвенно ссылаться на значение в контейнере.

Никакие итераторы или ссылки не инвалидируются.

Содержание

Параметры

pos - итератор, перед которым будет создан новый элемент
args - аргументы для передачи конструктору элемента
Требования к типам
-
Если T не является EmplaceConstructible в list из args... , поведение не определено

Возвращаемое значение

Итератор, указывающий на вставленный элемент.

Сложность

Константа.

Исключения

Если исключение выбрасывается (например, конструктором), контейнер остается неизменным, как если бы эта функция никогда не вызывалась (строгая гарантия исключений).

Пример

#include <iostream>
#include <string>
#include <list>
struct A
{
    std::string s;
    A(std::string str) : s(std::move(str)) { std::cout << " constructed\n"; }
    A(const A& o) : s(o.s) { std::cout << " copy constructed\n"; }
    A(A&& o) : s(std::move(o.s)) { std::cout << " move constructed\n"; }
    A& operator=(const A& other)
    {
        s = other.s;
        std::cout << " copy assigned\n";
        return *this;
    }
    A& operator=(A&& other)
    {
        s = std::move(other.s);
        std::cout << " move assigned\n";
        return *this;
    }
};
int main()
{
    std::list<A> container;
    std::cout << "construct 2 times A:\n";
    A two{"two"};
    A three{"three"};
    std::cout << "emplace:\n";
    container.emplace(container.end(), "one");
    std::cout << "emplace with A&:\n";
    container.emplace(container.end(), two);
    std::cout << "emplace with A&&:\n";
    container.emplace(container.end(), std::move(three));
    std::cout << "content:\n";
    for (const auto& obj : container)
        std::cout << ' ' << obj.s;
    std::cout << '\n';
}

Вывод:

construct 2 times A:
 constructed
 constructed
emplace:
 constructed
emplace with A&:
 copy constructed
emplace with A&&:
 move constructed
content:
 one two three

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

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

DR Applied to Behavior as published Correct behavior
LWG 2164 C++11 было неясно, могут ли аргументы ссылаться на контейнер прояснено

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

вставляет элементы
(public member function)
создаёт элемент на месте в конце
(public member function)