【发布时间】:2013-01-17 11:20:15
【问题描述】:
从文本文件中读取行的规范方法是:
std::fstream fs("/tmp/myfile.txt");
std::string line;
while (std::getline(line, fs)) {
doThingsWith(line);
}
(不,it is not while (!fs.eof()) { getline(line, fs); doThingsWith(line); }!)
这是因为 std::getline 通过引用返回流参数,并且因为:
- 在 C++03 中,流通过
operator void*() const中的operator void*() const转换为void*,当设置fail错误标志时计算为空指针值;- 见
[C++03: 27.4.4]&[C++03: 27.4.4.3/1]
- 见
- 在 C++11 中,流转换为
bool,通过std::basic_ios中的explicit operator bool() const,当设置了fail错误标志时计算为false- 见
[C++11: 27.5.5.1]&[C++11: 27.5.5.4/1]
- 见
在 C++03 中,这种机制意味着以下是可能的:
std::cout << std::cout;
它正确地导致一些任意指针值被输出到标准输出流。
但是,尽管 operator void*() const 在 C++11 中已被删除,但它也可以在 C++11 模式下的 GCC 4.7.0 中为我编译和运行。
这在 C++11 中怎么可能?还有其他一些我不知道的机制在起作用吗?或者它只是一个实现“奇怪”?
【问题讨论】:
-
@Nocturno,这不是为什么的问题,因为为什么
bool而不是void *(或同等学历)。这是一个问题,据 OP 所知,为什么 C++11 说代码不应该输出地址,但确实如此。如果我误解了,请纠正我。 -
@Nocturno:我认为你误解了这个问题。这不是合理化的要求。我希望有人告诉我,尽管删除了
operator void*() const,哪些 C++11 语言功能使std::cout << std::cout保持有效。 -
另外,“很少有人(如果有的话)知道原因”从不成为提出“坏问题”的理由。这只是意味着只有一两个答案,而不是......哦,等一下!如果有的话,它会通过传播这些知识来提出一个好的问题。
-
+1 非常好的问题+答案。这是一个非常好的线程。
-
@DougT。 “不喜欢 STL 的 iostreams 部分的另一个原因” - 由于 iostreams 不是 STL 的一部分,因此没有太多喜欢或不喜欢的地方。 (很抱歉吹毛求疵,但我希望它本着 OP 的精神);)
标签: c++ c++11 g++ std iostream