std::list::emplace(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::list::emplace(3) πŸ’–

okay so bestie, welcome to the std::list::emplace(3) page from the C++ Standard Libary manual ✨ (yes, that’s the manual name, spelling and all β€” we’re not doing a vibe check on the source, periodt). This is the page for the list member that emplaces stuff. Let’s get into it 🫢.


πŸŽ€ NAME πŸŽ€

std::list::emplace β€” std::list::emplace.

That’s it. That’s the name. No cap, it’s literally just the same thing twice πŸ’….

✨ Synopsis ✨

Available since C++11 πŸ¦‹:

template< class... Args >
iterator emplace( const_iterator pos, Args&&... args );

Okay so what does it do? It inserts a new element into the container directly before pos πŸ‘‘.

The element is constructed through std::allocator_traits::construct, which uses placement-new to construct the element in-place at a location provided by the container. The arguments args... are forwarded to the constructor as std::forward<Args>(args).... And bestie, args... may directly or indirectly refer to a value in the container β€” eye contact, this is important πŸ‘€.

No iterators or references are invalidated. Not me being obsessed with a function that doesn’t wreck your iterators 😭✨.

🌸 Parameters 🌸

  • pos β€” iterator before which the new element will be constructed.
  • args β€” arguments to forward to the constructor of the element.

πŸ¦‹ Type requirements πŸ¦‹

  • T (the container’s element type) must meet the requirements of EmplaceConstructible.

πŸ‘‘ Return value πŸ‘‘

Iterator pointing to the emplaced element. That’s the whole return value, iconic behavior πŸ’….

⭐ Complexity ⭐

Constant. That’s it. Constant. Slay.

πŸ’€ Exceptions πŸ’€

If an exception is thrown (e.g. by the constructor), the container is left unmodified, as if this function was never called β€” that’s the strong exception guarantee, bestie. So like, no half-built mess left behind, fr fr 🫢.

πŸ“ Example πŸ“

Run this code:

// Run this code

#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';
}

🌈 Output 🌈

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

πŸ’… Defect reports πŸ’…

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • DR LWG 2164 β€” applied to C++11; behavior as published: it was not clear whether the arguments can refer to the container; correct behavior: clarified.

πŸ‘€ See also πŸ‘€

  • insert β€” inserts elements (public member function).
  • emplace_back β€” constructs an element in-place at the end (C++11) (public member function).

kisses πŸ’– this page was served from http://cppreference.com, dated 2024.06.10, and it’s literally std::list::emplace(3) β€” bye bestie, go emplace something cute πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from