微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么流仍然转换为C11中的指针?

从文本文件读取行的规范方法是:
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中怎么可能呢?在工作中还有其他机制,我不知道吗?还是简单的实现“奇怪”?

解决方法

我相信这是不允许的/不能发生在C 11的一致性实施.

当然,问题在于,现在大多数实现都在遵循一致性,但是还没有完成.猜测,对于许多供应商来说,这个特别的更新是一个相当低的优先级.它可以改进错误检查,但是很少(或没有)启用新技术,添加功能,提高运行时效率等).这样可以让编译器捕获您引用的错误(some_stream< lt; some_other_stream),但是真的会有很大的不同. 如果我负责更新C11标准库,我认为这是一个相当低的优先级.还有其他一些变化可能很容易(如果不是容易)并入,并且可能对大多数程序员产生更大的影响. 要使用您给出的示例之一,如果我负责更新VC标准库以利用11月CTP中添加的编译器功能,我的首要任务可能是将标准容器类型的构造函数添加到接受初始化列表.这些是相当容易的添加(我猜猜一个人可能会在一个星期内添加和测试他们),并在程序员可以做什么相当明显的明显区别.

原文地址:https://www.jb51.cc/c/112078.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐