发送c字符串到非左值std :: ostringstream奇怪的行为

时间:2019-05-20 17:28:27

标签: c++

测试代码:

#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中的错误?

1 个答案:

答案 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左值引用。