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

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

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

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

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

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

1 Ответ

0 голосов
/ 15 ноября 2018

Ниже кода

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...