close
Espacios de nombres
Variantes

std::list::emplace

De cppreference.com
 
 
 
 
<tbody> </tbody>
template< class... Args > iterator emplace( const_iterator pos, Args&&... args );
(desde C++11)

Inserta un nuevo elemento en el contenedor directamente antes de la posición pos.

El elemento se construye a través de std::allocator_traits::construct, que utiliza new de ubicación para construir el elemento en el sitio en una ubicación proporcionada por el contenedor.

Los argumentos args... se reenvían al constructor como std::forward<Args>(args).... args... puede referirse a un valor en el contenedor directamente o indirectamente.

No se invalidan ni referencias ni iteradores.

Parámetros

pos - Iterador antes del cual se construirá el nuevo elemento.
args - Argumentos a reenviar al constructor del elemento.
Requisitos de tipo
-
T (el tipo de elemento del contenedor) debe satisfacer los requisitos de EmplaceConstructible.

Valor de retorno

Iterador que apunta al elemento emplazado.

Complejidad

Constante.

Excepciones

Si se lanza una excepción (p. ej., por el constructor), el contenedor no se modifica, como si esta función no se hubiera llamado nunca (garantía de excepción fuerte).


Ejemplo

#include <iostream>
#include <string>
#include <list>

struct Un {
    std::string s;
    Un(std::string str) : s(std::move(str))  { std::cout << " construido\n"; }
    Un(const Un& o) : s(o.s) { std::cout << " construido por copia\n"; }
    Un(Un&& o) : s(std::move(o.s)) { std::cout << " construido por movimiento\n"; }
    Un& operator=(const Un& other) {
        s = other.s;
        std::cout << " asignado por copia\n";
        return *this;
    }
    Un& operator=(Un&& other) {
        s = std::move(other.s);
        std::cout << " asignado por movimiento\n";
        return *this;
    }
};

int main()
{
    std::list<Un> container;
    
    std::cout << "construir 2 veces Un:\n";
    Un dos { "dos" };
    Un tres { "tres" };

    std::cout << "emplazar:\n";
    container.emplace(container.end(), "uno");

    std::cout << "emplazar con Un&:\n";
    container.emplace(container.end(), dos);

    std::cout << "emplazar con Un&&:\n";
    container.emplace(container.end(), std::move(tres));

    std::cout << "contenido:\n";
    for (const auto& obj : container)
        std::cout << ' ' << obj.s;
    std::cout << '\n';
}

Salida:

construir 2 veces Un:
 construido
 construido
emplazar:
 construido
emplazar con Un&:
 construido por copia
emplazar con Un&&:
 construido por movimiento
contenido:
 uno dos tres

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2164 C++11 No estaba claro si los argumentos se podían referir al contenedor. Se clarificó.

Véase también

Inserta elementos
(función miembro pública) [editar]
Construye un elemento en el sitio al final.
(función miembro pública) [editar]