Tout d'abord, je suis au courant de cette question, mais je ne crois pas que je te pose la même chose.
Je sais de quoi std::vector<T>::emplace_back
n' - et je comprends pourquoi je voudrais l'utiliser sur push_back()
. Il utilise variadic templates de me permettre d'avancer plusieurs arguments pour le constructeur d'un nouvel élément.
Mais ce que je ne comprends pas, c'est pourquoi la norme C++ comité a décidé il y avait un besoin pour une nouvelle fonction de membre. Pourquoi ne pourraient-ils pas tout simplement d'étendre les fonctionnalités de l' push_back()
. Aussi loin que je peux voir, push_back
pourrait être surchargé en C++11:
template <class... Args>
void push_back(Args&&... args);
Ce ne serait pas casser la compatibilité descendante, tout en vous permettant de passer à N arguments, y compris les arguments qui invoquent une normale rvalue ou constructeur de copie. En fait, la GCC C++11 de la mise en œuvre de l' push_back()
appelle simplement emplace_back de toute façon:
void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}
Donc, la façon dont je le vois, il n'est pas nécessaire pour emplace_back()
. Tout ce qu'ils devaient ajouter a une surcharge pour l' push_back()
qui accepte les variadic arguments, et en avant les arguments de l'élément constructeur.
Je suis mal ici? Est-il une raison pour laquelle une entièrement nouvelle fonction a été nécessaire ici?