No OS X, o programa C ++ simples fornece resultados incorretos (que são um resultado das opções de linha de comando 'c ++ 03' vs 'c ++ 11')

Este programa simples (quando compilado no Linux) irá CORRETAMENTE dar duas respostas diferentes com base em se ele é compilado com-std=c++0x ou não.

Problema: não consigo reproduzir a mesma coisa no OS X (Mountain Lion, 10.8 SDK). o que estou perdendo?

#include <iostream>
#include <sstream>

class Thing : public std::ostringstream
{
public:
    Thing() : std::ostringstream() {}
    virtual ~Thing() { std::cerr << str(); }
};

int main(int argc, const char * argv[]) {
    Thing() << "Hello" << std::endl;
    return 0;
}

Para entender o que quero dizer, faça o seguinte (no Linux primeiro, apenas para ver como deve funcionar):

> g++ main.cpp
> ./a.out
0x401471
> g++ -std=c++0x main.cpp
> ./a.out
Hello

O primeiro imprimirá um endereço hexadecimal, o segundo imprimirá "Olá". Este é o comportamento correto e é porque o operador<<&nbsp;resolve duas coisas diferentes (não há referências de valor em C ++ 03, então você vai lá).

Agora, tente a mesma coisa no OS X:

> xcrun c++ main.cpp
> ./a.out
0x10840dd88

(Isso corretamente produz a saída hexadecimal.)

> xcrun c++ -std=c++0x main.cpp
> ./a.out
0x10840dd88

(Opa ... ainda a saída hexadecimal ... Estamos no modo C ++ 11x, mas talvez os cabeçalhos corretos não estejam sendo usados?)

NOTA: A versão do compilador está aqui:

> xcrun c++ --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix

Observação: isso não é um problema de C ++ por si só, mas sim um problema de compilação do OS X. Para aqueles que estão interessados, a razão pela qual ele produz resultados diferentes com C ++ 03 e C ++ 11 é destacada abaixo em uma das respostas.