gpt4 book ai didi

c++ - 为什么在 C++11 中流仍然转换为指针?

转载 作者:可可西里 更新时间:2023-11-01 16:32:51 25 4
gpt4 key购买 nike

从文本文件中读取行的规范方法是:

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 中,流通过 std::basic_ios 中的 operator void*() const 转换为 void*,当设置了 fail 错误标志时计算空指针值;
    • 参见[C++03: 27.4.4] & [C++03: 27.4.4.3/1]
  • 在 C++11 中,流通过 std::basic_ios 中的explicit operator bool() const 转换为 bool,评估当设置了 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 中被删除,这也可以在 GCC 4.7.0 中以 C++11 模式为我编译和运行。

这在 C++11 中怎么可能呢?有没有其他我不知道的机制在起作用?或者它只是一个实现“奇怪”?

最佳答案

我有理由相信,在 C++11 的一致性实现中,这是不允许/不可能发生的。

当然,现在的问题是,大多数实现都在努力实现一致性,但还没有完全实现。据推测,对于许多供应商而言,此特定更新的优先级相当低。它改进了错误检查,但很少(或根本没有)启用新技术、添加新功能、提高运行时效率等。这让编译器可以捕获您引用的错误(some_stream << some_other_stream),但实际上并没有否则会有很大的不同。

如果我负责更新 C++11 的标准库,我认为这将是相当的低优先级。还有其他更改可能同样容易(如果不是更容易的话)合并,并且可能对大多数程序员产生更大的影响。

使用您提供的示例之一,如果我负责更新 VC++ 标准库以利用 11 月 CTP 中添加的编译器功能,我的首要任务可能是向标准容器类型添加构造函数接受initialization_list秒。这些很容易添加(我猜一个人可能会在不到一周的时间内添加和测试它们)并且在程序员可以做的事情上产生非常明显的差异。

关于c++ - 为什么在 C++11 中流仍然转换为指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14658276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com