首页 > 解决方案 > 将流打印到自身的目的可能是什么?

问题描述

我正在尝试构建一个第三方 C++ 代码库,其中有几个地方尝试将输出流打印到自身。此示例演示了相同形式的表达式:

#include <iostream>
int main(void) {
    std::cout << std::cout << "Say what?" << std::endl;
    return 0;
}

我发现在没有任何选项的情况下,g++ 4.8.5 以零投诉的方式接受该代码,但 g++ 8.2.1 以一个很好的旧“不匹配 'operator<<'”错误拒绝它。

我理解错误。我想知道的是,是否有任何理由认为它不是错误——是否有 C++ 版本或广泛使用的 C++ 编译器可以对此类代码做一些有用的事情?尽管它接受代码,但在我的书中 g++ 4.8.5 并不是这样的编译器,因为它构建的程序<<仅通过输出一个意义不明的十六进制数来评估第一个操作。

我认为这可能是一个简单的错字,可能被复制和粘贴放大了。例如,也许第二个std::cout是第一个的意外重复,或者它本来应该是std::endl。但是,在同一代码库中的不同源文件中,我看到将输出流打印到自身的相同习语应用于 type 的对象std::stringstream,这表明它可能是故意的。

我的总体目标是决定如何最好地修复代码。

标签: c++

解决方案


将流打印到自身的目的可能是什么?

这可能是无意的,或者意图本身就是一个错误。

GCC 版本之间的区别在于它们使用的 C++ 的默认方言。较新的 GCC 默认为 c++11 或更新版本。只要您使用 C++11 之前的方言,程序就应该使用较新的编译器进行编译。

C++11 中的变化是删除了从std::basic_iosto的隐式转换void*。此转换的目的是检查流的失败状态:null 表示失败的流,而非 null 表示允许该模式的有效流if(stream >> input)。在 C++11 中,转换被显式转换为bool. 由于新的转换是显式的,它不会应用于将流插入流中。这是一个向后不兼容的更改,可能被认为不是问题,因为现在不兼容的使用转换的方式(例如示例)将没有实际用途。事实上,在做一些没有实际用途的事情时,出现编译错误是很有用的。

我的总体目标是决定如何最好地修复代码。

可能只是删除 into 的cout插入cout。如果您担心输出必须保持不变,因为它可能会被另一个程序解析,那么您可以输出任何非零十六进制数字以保持输出相同以保持兼容性。


推荐阅读