この単純なプログラム (Linux でコンパイルされた場合) は、コンパイルされているかどうかに基づいて、2 つの異なる答えを正しく返します-std=c++0x
。
問題: OS X (Mountain Lion、10.8 SDK) で同じことを再現できません。私は何が欠けていますか?
#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;
}
私が何を意味するかを確認するには、次のようにします (最初に Linux で、それがどのように機能するかを確認するためだけに):
> g++ main.cpp
> ./a.out
0x401471
> g++ -std=c++0x main.cpp
> ./a.out
Hello
1 つ目は 16 進アドレスを出力し、2 つ目は "Hello" を出力します。これは正しい動作です。これは、演算子<<
が 2 つの異なるものに解決されるためです (C++03 には右辺値参照がないため、これで終わりです)。
次に、OS X で同じことを試してください。
> xcrun c++ main.cpp
> ./a.out
0x10840dd88
(これにより、16 進出力が正しく生成されます。)
> xcrun c++ -std=c++0x main.cpp
> ./a.out
0x10840dd88
(おっと...まだ 16 進数の出力です...C++11x モードですが、正しいヘッダーが使用されていない可能性がありますか?)
注: コンパイラのバージョンは次のとおりです。
> 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
注: これは C++ 自体の問題ではなく、OS X ビルドの問題です。興味のある方のために、C++03 と C++11 で異なる結果が生成される理由は、以下の回答の 1 つで強調表示されています。