различное поведение между gcc и clang в таком коде - PullRequest
0 голосов
/ 10 октября 2018
int main() 
{
    std::vector<char> delimiters = { ",", ";" };  
    std::cout << delimiters[0];
}

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

clang7.0.0 распечатывается,

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

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

Прервано

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

1 Ответ

0 голосов
/ 10 октября 2018

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

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

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

std::vector<char> delimiters = { ',', ';' }; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...