различное поведение между gcc и clang в таком коде

int main() 
{
    std::vector<char> delimiters = { ",", ";" };  
    std::cout << delimiters[0];
}

Я получаю разные ответы между gcc и clang

clang7.0.0 распечатать,

gcc8.2.0 выдает ошибку

завершение вызывается после создания экземпляра 'std::length_error' what(): невозможно создать std::vector больше, чем max_size()

Прервано

Какой компилятор прав?


person Point wind    schedule 10.10.2018    source источник
comment
std::vector<char> delimiters = { ",", ";" }; - неправильный вид кавычек.   -  person    schedule 10.10.2018
comment
Оба правы. Это неопределенное поведение.   -  person n. 1.8e9-where's-my-share m.    schedule 10.10.2018


Ответы (1)


Оба компилятора верны, потому что ваш код имеет неопределенное поведение.

Вы попали в ловушку. { ",", ";" } переводится как std::vector{const char*, const char*}. Поскольку у вас есть указатель, это допустимо синтаксически (поскольку он вызывает конструктор итератора вектора), но вы используете адрес двух несвязанных строковых литералов, который недействителен, поскольку итераторы должны указывать на один и тот же контейнер.

Что вам действительно нужно, чтобы заставить это работать, так это использовать символьные литералы, а не строковые литералы в списке инициализаторов, например

std::vector<char> delimiters = { ',', ';' }; 
person NathanOliver    schedule 10.10.2018