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

C++11 C++;11:二进制表达式ostream和ostringstream的操作数无效,c++11,C++11,为什么以下代码不再是有效的C++11代码(编译为C++98): #包括 #包括 int main() { std::ostringstream os; os它可以在C++03中编译,但一点意义都没有。C++11只是使用了一个新的特性使代码变得毫无意义,而不是一开始就编译 请参阅,std::ostringstream(以及所有其他流类)曾经有一个到void*的隐式转换。但是,这返回的不是正确的指针;如果流处于无效状态,则返回null;如果流是有效的,则返回null。这就是允许您编写例如 std::

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

#包括
#包括
int main()
{
std::ostringstream os;

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

请参阅,std::ostringstream(以及所有其他流类)曾经有一个到
void*
的隐式转换。但是,这返回的不是正确的指针;如果流处于无效状态,则返回null;如果流是有效的,则返回null。这就是允许您编写例如

std::ofstream ofs("filename");
if (ofs) ...
然而,到void*的转换是有问题的,因为你用void*做了其他愚蠢的事情。甚至在C++11之前,安全布尔习惯用法就被发现了,它会更好。但是对于C++11,添加了显式转换,这会好得多。因此对于C++11,到
void*
的转换被到的显式转换所取代bool,它允许编译相同的有用代码,而不允许编译无用的代码(比如你的代码),这就是为什么代码在C++11中不再工作的原因


这不是一件坏事。这是一件好事。您发现您所拥有的代码毫无意义,而不会在运行时出现错误。

执行您打算执行的操作的代码如下所示:

#include <sstream>
#include <iostream>

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

os向我们显示了您收到的错误消息。我要说的是,
os
还没有被分配。C++11这样更严格……您不能只编写爆炸式代码,然后期望编译器一直接受它。
std::cout@MooingDuck:这与根本不使用ostringstream并将文本直接发送到
std::cout
耸肩
std::ofstream ofs("filename");
if (ofs) ...
#include <sstream>
#include <iostream>

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