Xcode 付属の clang で C++11 の機能を使う

STLvector コンテナを、リテラルで初期化する以下のコードを書いた。

std::vector<int> vec = {1, 2, 3};

これを Xcode 5.0.2 付属の g++ (実体は Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)) でコンパイルしようとしたら、

non-aggregate type 'std::vector<int>' cannot be initialized with an initializer list

というエラーになった。

この構文は C++11 での新機能なので(関連項目として c++ - What are Aggregates and PODs and how/why are they special? - Stack Overflow を挙げておく)、--std=c++11 (c++0x でも可)を付けないとダメ。ここまでは想定内だったのだが、これをつけても、

no matching constructor for initialization of 'std::vector<int>'

と言われた。はて?

いろいろ調査した結果、C++11 に対応した GNU libstdc++ の新しい版がライセンスの都合上 clang から使いにくいため、あえて古いバージョンが同梱されているという。そこで、LLVM 側が開発している libc++ を使うべしとのこと。(詳細は Mac OS X環境でclangを使ってC++11をboostとともに使う環境を構築するの巻 - beatsync.net 参照)

結局、

g++ --std=c++0x -stdlib=libc++  test.cpp

コンパイルが通った。なお、clang++ じゃないとダメと書いてあるサイトもあったが、どちらでも大丈夫だった。

ちなみに、vector を初期化するいろいろな方法については c++ - What is the easiest way to initialize a std::vector with hardcoded elements? - Stack Overflow が面白い。