web-dev-qa-db-fra.com

Pourquoi ce code compile-t-il (C ++ 11) sans erreur de non-correspondance de type?

std::vector<char> p = {"abc", "def"};

"abc" et "def" ne sont pas char, pourquoi le compilateur ne me donne-t-il pas une erreur à propos de cette incompatibilité de type?

45
ebi

Vous n'appelez pas le constructeur de vector qui prend un initializer_list<char>. Ce constructeur n'est pas viable car, comme vous l'avez dit, vous ne passez pas une liste de chars.

Mais vector a aussi un constructeur qui amène les itérateurs à une gamme d'éléments.

template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );

Malheureusement, ce constructeur correspond car les deux arguments seront chacun implicitement convertis en char const *. Mais votre code a un comportement indéfini car les itérateurs de début et de fin transmis au constructeur ne sont pas une plage valide.

57
Praetorian