Namespaces
Variants
Views
Actions

Difference between revisions of "Template:cpp/container/emplace back"

From cppreference.com
(There are very few good uses of rvalue-references in function arguments, this is not one of them.)
(note on bool)
Line 28: Line 28:
 
If {{tt|T}}'s move constructor is not {{c|noexcept}} and the copy constructor is not accessible, vector will use the throwing move constructor. If it throws, the guarantee is waived and the effects are unspecified.
 
If {{tt|T}}'s move constructor is not {{c|noexcept}} and the copy constructor is not accessible, vector will use the throwing move constructor. If it throws, the guarantee is waived and the effects are unspecified.
 
}}
 
}}
 +
{{#ifeq:{{{1|}}}|vector|
  
 +
===Notes===
 +
The specialization [[cpp/container/vector_bool|std::vector<bool>]] did not have {{tt|emplace_back()}} member until C++14.
 +
 +
}}
 
===Example===
 
===Example===
 
{{example
 
{{example

Revision as of 18:33, 19 March 2014

template< class... Args >
void emplace_back( Args&&... args );
(since C++11)

Appends a new element to the end of the container. The element is constructed in-place, i.e. no copy or move operations are performed. The constructor of the element is called with exactly the same arguments that are supplied to the function.

Contents

Parameters

args - arguments to forward to the constructor of the element

Return value

(none)

Complexity

Constant.

Exceptions

If an exception is thrown, this function has no effect (strong exception guarantee).


Example

The following code uses emplace_back to append an object of type President to a std::{{{1}}}. It demonstrates how emplace_back forwards parameters to the President constructor and shows how using emplace_back avoids the extra copy or move operation required when using push_back.

#include <{{{1}}}>
#include <string>
#include <iostream>
 
struct President
{
    std::string name;
    std::string country;
    int year;
 
    President(std::string p_name, std::string p_country, int p_year)
        : name(std::move(p_name)), country(std::move(p_country)), year(p_year)
    {
        std::cout << "I am being constructed.\n";
    }
    President(President&& other)
        : name(std::move(other.name)), country(std::move(other.country)), year(other.year)
    {
        std::cout << "I am being moved.\n";
    }
    President& operator=(const President& other) = default;
};
 
int main()
{
    std::{{{1}}}<President> elections;
    std::cout << "emplace_back:\n";
    elections.emplace_back("Nelson Mandela", "South Africa", 1994);
 
    std::{{{1}}}<President> reElections;
    std::cout << "\npush_back:\n";
    reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));
 
    std::cout << "\nContents:\n";
    for (President const& president: elections) {
        std::cout << president.name << " was elected president of "
                  << president.country << " in " << president.year << ".\n";
    }
    for (President const& president: reElections) {
        std::cout << president.name << " was re-elected president of "
                  << president.country << " in " << president.year << ".\n";
    }
}

Output:

emplace_back:
I am being constructed.
 
push_back:
I am being constructed.
I am being moved.
 
Contents:
Nelson Mandela was elected president of South Africa in 1994.
Franklin Delano Roosevelt was re-elected president of the USA in 1936.

See also

adds an element to the end
(public member function of std::{{{1}}}) [edit]