为什么下列代码不再是有效的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);发布于 2013-08-26 16:41:41
它可以在C++03中编译,但一点意义都没有。C++11只是使用了一个新特性来使代码变得毫无意义,而不是一开始就编译。
参阅,std::other流(和所有其他流类)过去有一个隐式转换到void*。但是,返回的不是一个正确的指针;如果流处于无效状态,则为null;如果流有效,则为null。这就是让你写作的原因。
std::ofstream ofs("filename");
if (ofs) ...但是,转换到void*是有问题的,因为您使用void*做了其他愚蠢的事情。甚至在C++11之前,人们就发现了“安全”这个成语会更好。但是对于C++11,增加了显式转换,这要好得多。因此,对于C++11,向void*的转换被显式转换为bool,这允许同样有用的代码编译,而不允许无用的代码(如您的代码)编译。这就是为什么代码在C++11中不再起作用的原因。
这不是件坏事。这是一件好事。您发现您所拥有的代码是没有意义的,没有它在运行时发生错误的痛苦。
发布于 2013-08-26 18:47:17
执行您打算做的工作的代码如下:
#include <sstream>
#include <iostream>
int main()
{
std::ostringstream os;
os << "Hello World!";
std::cout << os.str() << std::endl;
return 0;
}https://stackoverflow.com/questions/18448846
复制相似问题