Во-первых, я знаю этот вопрос, но я не верю, что я прошу то же самое.
Я знаю, что делает std::vector<T>::emplace_back
, и я понимаю, почему я буду использовать его поверх push_back()
. Он использует вариационные шаблоны, позволяющие мне пересылать несколько аргументов конструктору нового элемента.
Но я не понимаю, почему комитет по стандарту С++ решил, что существует потребность в новой функции-члене. Почему они не могут просто расширить функциональность push_back()
. Насколько я вижу, push_back
может быть перегружен в С++ 11:
template <class... Args>
void push_back(Args&&... args);
Это не нарушит совместимость в обратном направлении, позволяя вам передавать N аргументов, включая аргументы, которые будут вызывать обычный конструктор rvalue или copy. Фактически реализация GCC С++ 11 push_back()
просто вызывает emplace_back:
void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}
Итак, как я его вижу, нет необходимости в emplace_back()
. Все, что им нужно было добавить, это перегрузка для push_back()
, которая принимает вариационные аргументы и пересылает аргументы конструктору элемента.
Я здесь не прав? Есть ли какая-то причина, что здесь нужна совершенно новая функция?