测试代码:
#include <iostream>
#include <sstream>
int main() {
std::ostringstream q;
std::cout << (dynamic_cast<std::ostringstream&>(q<<"hello"<<101).str()) << "\n";
std::cout << (dynamic_cast<std::ostringstream&>(std::ostringstream()<<"hello"<<101).str()) << "\n";
return 0;
}
编译方式:g ++ test.cpp 输出:
hello101
hello101
编译方式:g ++ -std = c ++ 98 test.cpp 输出:
hello101
0x4b2ec0101
好像第二个字符串包含指向字符串本身的“ hello”字符串指针的指针。为什么? 它是c ++ 98标准的“功能”还是gcc中的错误?
答案 0 :(得分:2)
在C ++ 03中,负责打印C字符串的非成员operator<<
(source)
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
const char* s );
不能接受右值流,因此选择了一个成员重载(从std::ostream
基类继承)(source):
basic_ostream& operator<<( const void* value );
这会打印出地址。
在C ++ 11中,有一个右值流插入运算符,
template< class CharT, class Traits, class T >
basic_ostream< CharT, Traits >& operator<<( basic_ostream<CharT,Traits>&& os,
const T& value );
确保左值和右值流的行为相同。请注意,这种重载不可能用C ++ 03编写,因为绑定到右值的唯一方法是通过const左值引用。