子类化字符串流给出" 0x401bad ABC"而不是" Foo ABC"

时间:2015-02-19 16:56:28

标签: c++ stringstream

#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

1 个答案:

答案 0 :(得分:7)

operator<<分两部分实施:

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

我们担心该字符串文字的first one。正如您在链接中看到的,所有重载都采用对std::ostream的非const引用。这意味着您的临时A()不适合。因此,member function使用了const void*

C ++ 11增加了对std::ostream的rvalue引用的支持,用于接受临时对象的泛型const T &参数,因此在使用C ++ 11进行编译时会打印字符串文字。< / p>