Почему этот код компилируется (С++ 11) без ошибки несоответствия типа?

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

"abc" и "def" не являются char, почему компилятор не дает мне ошибку об этом несоответствии типа?

Ответ 1

Вы не вызываете vector конструктор, который принимает initializer_list<char>. Этот конструктор не является жизнеспособным, потому что, как вы сказали, вы не передаете список char.

Но vector также имеет конструктор, который принимает итераторы в ряд элементов.

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

К сожалению, этот конструктор соответствует, потому что два аргумента будут каждый неявно преобразовывать в char const *. Но ваш код имеет неопределенное поведение, поскольку начальные и конечные итераторы, передаваемые конструктору, не являются допустимым диапазоном.