STL の vector コンテナを、リテラルで初期化する以下のコードを書いた。
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 が面白い。