W systemie OS X prosty program C ++ daje nieprawidłowe wyniki (które są wynikiem opcji wiersza polecenia c ++ 03 'vs' c ++ 11 ')

Ten prosty program (po skompilowaniu w systemie Linux) PRAWIDŁOWO udzieli dwóch różnych odpowiedzi na podstawie tego, czy jest skompilowany-std=c++0x albo nie.

Problem: Nie mogę odtworzyć tego samego na OS X (Mountain Lion, 10.8 SDK). czego mi brakuje?

#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;
}

Aby zobaczyć, co mam na myśli, wykonaj następujące czynności (najpierw w systemie Linux, aby zobaczyć, jak powinno to działać):

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

Pierwszy wydrukuje adres szesnastkowy, drugi wydrukuje „Hello”. Jest to poprawne zachowanie, ponieważ operator<< rozwiązuje dwie różne rzeczy (w C ++ 03 nie ma odwołań do wartości rvalue, więc nie ma).

Teraz spróbuj tego samego na OS X:

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

(To poprawnie generuje wyjście szesnastkowe.)

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

(Ups ... nadal jest wyjście szesnastkowe ... Jesteśmy w trybie C ++ 11x, ale może nie są używane poprawne nagłówki?)

UWAGA: Wersja kompilatora jest tutaj:

> 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

UWAGA: To nie jest sam problem C ++, ale raczej problem z kompilacją OS X. Dla tych, którzy są zainteresowani, powód, dla którego daje różne wyniki w C ++ 03 i C ++ 11, jest podświetlony poniżej w jednej z odpowiedzi.

questionAnswers(2)

yourAnswerToTheQuestion