45 votes

Pourquoi le push_back ne pourrait-il pas être surchargé pour faire le travail de emplace_back?

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?

41voto

Benjamin Lindley Points 51005

Si T a un constructeur de conversion explicite, il existe un comportement différent entre emplace_back et push_back .

 struct X
{
    int val;
    X() :val() {}
    explicit X(int v) :val(v) {}
};

int main()
{
    std::vector<X> v;
    v.push_back(123);    // this fails
    v.emplace_back(123); // this is okay
}
 

Faire le changement que vous suggérez signifierait que push_back serait légal dans ce cas, et je suppose que ce n'était pas le comportement souhaité. Je ne sais pas si c'est la raison, mais c'est la seule chose que je peux trouver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X