2015-02-19 4 views
5
#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"); 
} 

Я ожидавшую программу для печати:подклассов stringstream дает "0x401bad ABC" вместо "Foo ABC"

Foo ABC 

вместо

0x401bad ABC 

Почему 0x401bad ABC печатается ?

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

Clang и GCC дают мне ожидаемый результат. Предоставьте детали компилятора/библиотеки. – chris

+0

g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 –

+0

Вам повезло получить этот хороший указатель :) – Slava

ответ

7

operator<< реализуется в двух частях:

  • Перегрузки для символьных данных являются свободными функциями.
  • Другие перегрузки являются членами std::ostream.

Мы обеспокоены first one для этого строкового литерала. Как вы можете видеть в ссылке, все перегрузки принимают неконстантную ссылку на std::ostream. Это означает, что ваш временный A() не подходит. Таким образом, используется member function, принимающий const void*.

C++ 11 добавляет поддержку ссылки rvalue на std::ostream для общего аргумента const T &, который принимает ваш временный объект, поэтому строковый литерал печатается при компиляции с C++ 11.

Смежные вопросы