C ++ использует инициализированные по умолчанию итераторы для создания пустой строки std :: string - PullRequest
5 голосов
/ 07 мая 2019

Является ли следующий код действительным и четко определенным?

auto start = std::string::const_iterator();
auto end = std::string::const_iterator();

auto output = std::string(start, end);

(ожидаемый вывод - пустая строка.)

1 Ответ

7 голосов
/ 07 мая 2019

Согласно cppreference.com, итератору произвольного доступа, одним из которых является строковый итератор, отвечает всем требованиям двунаправленного итератора .

Кроме того, двунаправленный итератор соответствует всем требованиям прямого итератора .

Наконец, начиная с C ++ 14, прямой итератор может быть инициализирован значением и будет сравниваться равным всем другим инициализированным значением прямым итераторам того же типа:

LegacyForwardIterator, инициализированный значением, ведет себя как последний итератор некоторого неопределенного пустого контейнера: он сравнивает равно всем инициализированным значением LegacyForwardIterators того же тип.

Исходя из этого, я считаю, что это хорошо определено, по крайней мере, в C ++ 14.

...