Является ли следующий код действительным и четко определенным?
auto start = std::string::const_iterator(); auto end = std::string::const_iterator(); auto output = std::string(start, end);
(ожидаемый вывод - пустая строка.)
Согласно cppreference.com, итератору произвольного доступа, одним из которых является строковый итератор, отвечает всем требованиям двунаправленного итератора .
Кроме того, двунаправленный итератор соответствует всем требованиям прямого итератора .
Наконец, начиная с C ++ 14, прямой итератор может быть инициализирован значением и будет сравниваться равным всем другим инициализированным значением прямым итераторам того же типа:
LegacyForwardIterator, инициализированный значением, ведет себя как последний итератор некоторого неопределенного пустого контейнера: он сравнивает равно всем инициализированным значением LegacyForwardIterators того же тип.
Исходя из этого, я считаю, что это хорошо определено, по крайней мере, в C ++ 14.