CppCon 2018, Николай Йосуттис: Почему они интерпретируются как итераторы?
Презентация Николая Хосуттиса "Кошмар инициализации в C++" на CppCon 2018 содержала в какой-то момент следующий фрагмент кода:
std::vector< std::string > v07 = {{ "1", "2" }};
Николай сказал следующее (транскрипция моя):
Проблема в том, что здесь происходит, мы интерпретируем эти два параметра как итераторы. Итак, это итераторы, так что это начало диапазона, и это конец диапазона, и они должны ссылаться на тот же диапазон символов; потому что символы неявно преобразуются в строки, это скомпилирует. Если вам повезет, вы получите coredump. Если нет, у вас есть большая проблема.
Он потерял меня там. Может кто-нибудь объяснить, что здесь происходит, точно, шаг за шагом?
Ответы
Ответ 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.