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); }
!)
这个工作beacuse std :: getline通过引用返回流参数,因为:
>在C 03中,流转换为void *,通过std :: basic_ios中的一个运算符void *()const,当设置失败错误标志时评估为空指针值;
>见[C 03:27.4.4]& [C 03:27.4.4.3/1]
>在C 11中,流通过std :: basic_ios中的显式运算符bool()const转换为bool,当设置失败错误标志时评估为false
>见[C 11:27.5.5.1]& [C 11:27.5.5.4/1]
在C 03这个机制意味着以下是可能的:
std::cout << std::cout;
然而,尽管在C11中已经删除了operator *()const,但在C11模式下,这也在GCC 4.7.0中为我编译并运行.
在C 11中怎么可能呢?在工作中还有其他机制,我不知道吗?还是简单的实现“奇怪”?
解决方法
当然,问题在于,现在大多数实现都在遵循一致性,但是还没有完成.猜测,对于许多供应商来说,这个特别的更新是一个相当低的优先级.它可以改进错误检查,但是很少(或没有)启用新技术,添加新功能,提高运行时效率等).这样可以让编译器捕获您引用的错误(some_stream< lt; some_other_stream),但是真的会有很大的不同. 如果我负责更新C11标准库,我认为这是一个相当低的优先级.还有其他一些变化可能很容易(如果不是容易)并入,并且可能对大多数程序员产生更大的影响. 要使用您给出的示例之一,如果我负责更新VC标准库以利用11月CTP中添加的编译器功能,我的首要任务可能是将标准容器类型的构造函数添加到接受初始化列表.这些是相当容易的添加(我猜猜一个人可能会在一个星期内添加和测试他们),并在程序员可以做什么相当明显的明显区别.