Вызывает ли следующая программа неопределенное поведение?
#include <iostream>
#include <iterator>
int main(int argc, char* argv[])
{
for (auto it = std::istream_iterator<std::string>(std::cin);
it != std::istream_iterator<std::string>();
++it)
{
std::cout << *it << " ";
}
return 0;
}
В этом четырехлетнем вопросе говорится, что их нельзя сравнивать:
Итераторы также могут иметь сингулярные значения, не связанные ни с одним контейнером. [Пример: после объявления неинициализированного указателя x (как в случае с int* x;) всегда следует предполагать, что x имеет единственное значение указателя. ] Результаты большинства выражений не определены для сингулярных значений; единственным исключением является присвоение неединственного значения итератору, который содержит единственное значение.
Но другой ответ говорит о стандарте С++ 14:
Однако итераторы, инициализированные значением, могут сравниваться и должны сравниваться с другими итераторами, инициализируемыми значением того же типа.
std::copy
, чтобы получить все значения из потока, например, в вектор, см. пример кода на этойstd::istream_iterator
справочной странице. - person Some programmer dude   schedule 07.10.2014