2 votes

Pourquoi std::vector::insert est une opération nulle avec une liste d'initialisation vide ?

Dans le code suivant :

#include <iostream>
#include <vector>

int main()
{
    std::cout<<"Hello World";
    std::vector<std::vector<int>> v;
    while(v.size() <= 2){
        v.insert(v.begin(),{}); //1
        std::cout << "!";
    }
    return 0;
}

La sortie devient de plus en plus agressive à chaque itération, car la v.size() n'augmente jamais, malgré les insert fonctionnement.

Cependant, lorsque le initializer_list a un élément en lui, ou remplacé par un temporaire, le cycle s'exécute autant de fois que prévu.

...
v.insert(v.begin(),{0}); //1
...

...
v.insert(v.begin(),std::vector<int>()); //1
...

Pourquoi ? Ne devrait-il pas y avoir une erreur de compilation si la conversion implicite échoue ?

5voto

john Points 23351

Votre code demande d'insérer dans le vecteur autant d'éléments qu'il y en a dans la liste d'initialisation. Comme il n'y a aucun élément dans la liste d'initialisation, rien n'est inséré.

Je ne suis pas sûr de ce que vous attendiez à la place, peut-être vous attendiez-vous à ce qu'un vecteur soit créé à partir de la liste d'initialisation et que ce vecteur soit inséré, c.-à-d.

v.insert(v.begin(),std::vector<int>{})

mais cela n'arrive pas parce que vector<T>::insert a une surcharge qui prend un initializer_list<T> directement (et qui se comporte comme je l'ai décrit ci-dessus).

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