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