gpt4 book ai didi

C++11:二进制表达式 ostream 和 ostringstream 的操作数无效

转载 作者:行者123 更新时间:2023-12-04 16:34:28 26 4
gpt4 key购买 nike

为什么以下不再是有效的 C++11 代码(编译为 C++98):

#include <sstream>
#include <iostream>

int main()
{
std::ostringstream os;
os << "Hello World!";
std::cout << os << std::endl;
return 0;
}

供引用的是(截断的)我用 clang 得到的:
$ clang++ -stdlib=libc++ -std=c++11 t.cxx
t.cxx:8:13: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::ostringstream' (aka 'basic_ostringstream<char>'))
std::cout << os << std::endl;
~~~~~~~~~ ^ ~~
/usr/include/c++/v1/ostream:190:20: note: candidate function not viable: no known conversion from 'std::ostringstream' (aka 'basic_ostringstream<char>') to
'const void *' for 1st argument; take the address of the argument with &
basic_ostream& operator<<(const void* __p);

最佳答案

它可以在 C++03 中编译,但它没有一点意义。 C++11 只是使用了一个新特性,让代码变得毫无意义,而不是首先编译。

参见,std::ostringstream(和所有其他流类)曾经隐式转换为 void* .但是,这返回的不是正确的指针;如果流处于无效状态,则它只是 null,或者如果它有效则不为 null。这就是允许你写的东西,例如

std::ofstream ofs("filename");
if (ofs) ...

但是,转换为 void* 是有问题的,因为您使用 void* 做了其他愚蠢的事情。甚至在 C++11 之前,就发现了 safe-bool 习语会更好。但是对于 C++11,添加了显式转换,这要好得多。所以对于 C++11,转换为 void*被显式转换为 bool 所取代,这允许编译相同的有用代码,而不允许编译无用代码(例如您的代码)。这就是代码在 C++11 中不再起作用的原因。

这不是一件坏事。这是一件好事。您发现您拥有的代码没有意义,没有它在运行时行为不端的痛苦。

关于C++11:二进制表达式 ostream 和 ostringstream 的操作数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18448846/

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