C++ 与值初始化迭代器进行比较是否定义良好?

C++ 与值初始化迭代器进行比较是否定义良好?,c++,c++11,C++,C++11,以下程序是否调用未定义的行为 #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)

以下程序是否调用未定义的行为

#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;
}
#包括
#包括
int main(int argc,char*argv[])
{
for(自动it=std::istream_迭代器(std::cin);
it!=std::istream_迭代器();
++(it)
{

你把两个不同的问题混为一谈了

istream\u迭代器
是一个输入迭代器,而不是前向迭代器,因此您引用的C++14更改根本不适用于它。您可以以这种方式比较
istream\u迭代器
s,因为它们被明确指定为允许进行此类比较。标准规定(§24.6.1[istream.iterator])

不带参数的构造函数始终是流迭代器() 构造流结束输入迭代器对象,它是 用于结束条件的合法迭代器。[…]

两个流结束迭代器总是相等的。流结束迭代器 迭代器不等于流的非结束迭代器。2 当非流结束迭代器是由 同一条小溪

对于前向迭代器(也包括双向和随机访问迭代器)通常,中的值初始化迭代器可以相互比较。如果您的标准库实现了它,则可以比较两个值初始化迭代器。这允许您在没有底层容器的情况下创建空范围。但是,仍然不允许您将非单值迭代器与值初始化迭代器进行比较。即使在C++14中,以下代码也有未定义的行为:

std::list<int> l;

if(l.begin() == std::list<int>::iterator())
    foo();
else 
    bar();
std::list l;
if(l.begin()==std::list::iterator())
foo();
其他的
bar();

不习惯以这种方式使用迭代器,循环何时结束(或您希望何时结束)?该循环确实是定义良好的,与任何其他迭代器循环一样,你有它的开始和循环,直到它的结束。在调用中使用输入流迭代器也是很常见的,例如,要将流中的所有值获取到向量中,请参见中的示例代码。我担心你混合了比较迭代器和comp是解引用迭代器的值,其中未定义解引用end()。