首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11:二进制表达式ostream和ostream流的无效操作数

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

Stack Overflow用户
提问于 2013-08-26 16:38:30
回答 2查看 8.3K关注 0票数 5

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

代码语言:javascript
复制
#include <sstream>
#include <iostream>

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

这里供参考的是(截断)我从clang得到的内容:

代码语言:javascript
复制
$ 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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-26 16:41:41

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

参阅,std::other流(和所有其他流类)过去有一个隐式转换到void*。但是,返回的不是一个正确的指针;如果流处于无效状态,则为null;如果流有效,则为null。这就是让你写作的原因。

代码语言:javascript
复制
std::ofstream ofs("filename");
if (ofs) ...

但是,转换到void*是有问题的,因为您使用void*做了其他愚蠢的事情。甚至在C++11之前,人们就发现了“安全”这个成语会更好。但是对于C++11,增加了显式转换,这要好得多。因此,对于C++11,向void*的转换被显式转换为bool,这允许同样有用的代码编译,而不允许无用的代码(如您的代码)编译。这就是为什么代码在C++11中不再起作用的原因。

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

票数 13
EN

Stack Overflow用户

发布于 2013-08-26 18:47:17

执行您打算做的工作的代码如下:

代码语言:javascript
复制
#include <sstream>
#include <iostream>

int main()
{
  std::ostringstream os;
  os << "Hello World!";
  std::cout << os.str() << std::endl;
  return 0;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18448846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档