【发布时间】:2014-12-02 05:26:26
【问题描述】:
以下程序是否调用未定义的行为?
#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;
}
这个4 year old question 说他们无法比较:
迭代器也可以有不相关的奇异值 任何容器。 【例子:声明一个未初始化的之后 指针 x(与 int* x; 一样),必须始终假定 x 具有 指针的奇异值。 ] 大多数表达式的结果是 未定义奇异值;唯一的例外是分配 将非奇异值转换为包含奇异值的迭代器。
但是对于 C++14 标准的另一个答案:
然而,值初始化的迭代器可以被比较并且应该被比较 等于其他相同类型的值初始化迭代器。
【问题讨论】:
-
不习惯以这种方式使用迭代器,循环何时结束(或您希望结束)?
-
这个循环确实是定义良好的,它就像任何其他迭代器循环一样,你有它的开始并循环到它的结束。在调用中使用像这样的输入流迭代器也很常见。
std::copy将流中的所有值获取到一个向量中,例如,参见 thisstd::istream_iteratorreference page 中的示例代码。 -
我担心你正在混合比较迭代器和取消引用迭代器的比较值,其中取消引用 end() 是未定义的。