subclassing stringstream给出"0x401bad ABC"而不是"Foo ABC"

Mic*_*rek 5 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");
}
Run Code Online (Sandbox Code Playgroud)

我期待打印的程序:

Foo ABC
Run Code Online (Sandbox Code Playgroud)

代替

0x401bad ABC
Run Code Online (Sandbox Code Playgroud)

为什么要打印0x401bad ABC

g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)

chr*_*ris 7

operator<< 分为两部分:

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

我们担心该字符串文字的第一个.正如您在链接中看到的,所有重载都采用非const引用std::ostream.这意味着你的临时A()不适合.因此,成员函数拍摄const void*被使用.

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