Не было бы никакого усиления по сравнению с push_back
Сила emplace_back
в том, что создает объект на месте , где он предназначен для пребывания. Никаких копий или ходов не требуется. Кроме того, он обеспечивает более простой синтаксис для создания объектов, но это лишь незначительное преимущество.
class Person
{
std::string name;
int age;
double salary;
}
int main()
{
std::vector<Person> people;
people.push_back(Person{"Smith", 42, 10000.0}); //temporary object is needed, which is moved to storage
people.emplace_back("Smith", 42, 10000.0); //no temporary object and concise syntax
}
Для std::string
(или любого теоретического контейнера, который может содержать только примитивные типы), усиление отсутствует. Независимо от того, создаете ли вы объект на месте или перемещаете или копируете его, вы выполняете одну и ту же операцию на уровне сборки - записываете несколько байтов в заданную память.
Синтаксис также не может стать более кратким, чем он есть - нет конструктора, который нуждается в быть позванным. Вы можете использовать литерал или другую переменную, но вы должны сделать то же самое в push_back
и emplace_back
int main()
{
std::vector<char> letters;
letters.push_back('a');
letters.emplace_back('a'); //no difference
}