CppCon 2018, Николай Йосуттис: Почему они интерпретируются как итераторы? - программирование
Подтвердить что ты не робот

CppCon 2018, Николай Йосуттис: Почему они интерпретируются как итераторы?

Презентация Николая Хосуттиса "Кошмар инициализации в C++" на CppCon 2018 содержала в какой-то момент следующий фрагмент кода:

std::vector< std::string > v07 = {{ "1", "2" }};

Николай сказал следующее (транскрипция моя):

Проблема в том, что здесь происходит, мы интерпретируем эти два параметра как итераторы. Итак, это итераторы, так что это начало диапазона, и это конец диапазона, и они должны ссылаться на тот же диапазон символов; потому что символы неявно преобразуются в строки, это скомпилирует. Если вам повезет, вы получите coredump. Если нет, у вас есть большая проблема.

Он потерял меня там. Может кто-нибудь объяснить, что здесь происходит, точно, шаг за шагом?

4b9b3361

Ответ 1

Ниже код

std::vector< std::string > v07 = { { "1", "2" } };

эквивалентно

std::string s = {"1","2"}; // call string(const char*, const char*)
std::vector<std::string> v07 = {s}; // initializer list with one item

проблема с

   s={"1","2"};

Это вызывает конструктор string(const char* start, const char* end), но start и end должны ссылаться на один и тот же строковый объект. "1" и "2" - два разных объекта, поэтому это приводит к UB.