以下代码将字符串文字输出到包含匿名和命名流的文件:
#include <fstream>
using namespace std;
int main()
{
ofstream("testfile") << "test" << endl;
ofstream ofs ("testfile2");
ofs << "test2" << endl;
return 0;
}
从strace的输出中可以看出,只有命名的流有效:
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(3, "0x400a91\n", 9) = 9
close(3) = 0
open("testfile2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(3, "test2\n", 6) = 6
close(3) = 0
另外,如果使用std :: string而不是文字,则无法编译。
为什么会这样?
答案 0 :(得分:9)
您遇到的问题是“匿名流”是一个右值,而使用C ++ 98,您只能在其上调用成员函数。 stream << "test"
将绑定到一个成员void*
,该成员输出指针的地址。
C ++ 11添加了一个带有右值流的operator<<
,这将使代码工作。
答案 1 :(得分:4)
在C ++ 03中,输出字符指针和字符串的非成员运算符不能使用rvalue调用,因为它们需要左值引用,因此调用成员operator<<(const void *)
。在C ++ 11中,这是通过编写带有右值引用的重载来解决的,但在C ++ 03中,您可以通过调用返回左值引用的成员函数或成员运算符来解决它(注意非const成员函数< em>可以在rvalues上调用):
ofstream("testfile").write("", 0) << "test" << endl;
您可以轻松编写操纵器来执行此操作:
std::ios_base& (*do_nothing)(std::ios_base&) ) {}
ofstream("testfile") << do_nothing << "test" << endl;