子类化字符串流提供"0x401bad ABC"而不是"Foo ABC"


#include <sstream>
#include <iostream>
#include <string>
class A : public std::stringstream {
        public:
                A() {}
                ~A() { std::cout << str().c_str() << std::endl; }
};
int main() {
    A() << "Foo" << std::string(" ABC");
}

我期待程序打印:

Foo ABC

而不是

0x401bad ABC

为什么要打印0x401bad ABC

g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
operator<<

两部分实现:

  • 字符数据的重载是免费函数。
  • 其他重载是 std::ostream 的成员。

我们关注的是该字符串文本的第一个。正如您在链接中看到的,所有重载都采用对 std::ostream 的非常量引用。这意味着您的临时A()不适合。因此,使用成员函数获取const void*

C++11 添加了对泛型 const T & 参数的 std::ostream 的右值引用的支持,该参数接受临时对象,因此在使用 C++11 编译时打印字符串文本。

最新更新