En OS X, el simple programa C ++ da resultados incorrectos (que son el resultado de las opciones de línea de comandos 'c ++ 03' vs 'c ++ 11')
Este sencillo programa (cuando se compila en Linux) dará CORRECTAMENTE dos respuestas diferentes en función de si está compilado con-std=c++0x
o no.
Problema: no puedo reproducir lo mismo en OS X (Mountain Lion, 10.8 SDK). ¿Qué me estoy perdiendo?
#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 ver lo que quiero decir, haga lo siguiente (en Linux primero, solo para ver cómo debería funcionar):
> g++ main.cpp
> ./a.out
0x401471
> g++ -std=c++0x main.cpp
> ./a.out
Hello
La primera imprimirá una dirección hexadecimal, la segunda imprimirá "Hola". Este es el comportamiento correcto y es porque el operador<<
se resuelve en dos cosas diferentes (no hay referencias de valor en C ++ 03, así que ya está).
Ahora, intente lo mismo en OS X:
> xcrun c++ main.cpp
> ./a.out
0x10840dd88
(Esto produce correctamente la salida hexadecimal.)
> xcrun c++ -std=c++0x main.cpp
> ./a.out
0x10840dd88
(Vaya ... aún la salida hexadecimal ... Estamos en modo C ++ 11x, pero ¿quizás no se usan los encabezados correctos?)
NOTA: La versión del compilador está aquí:
> 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
NOTA: Este no es un problema de C ++ per se, sino un problema de compilación de OS X. Para aquellos que estén interesados, la razón por la que produce resultados diferentes con C ++ 03 y C ++ 11 se destaca a continuación en una de las respuestas.