以下の初期化式を利用するとコンパイルエラーが発生することがある。
// error: non-aggregate type 'std::vector<int>' cannot be initialized with an initializer list
std::vector<int> v = {1, 2, 3};
// error: non-aggregate type 'std::string' cannot be initialized with an initializer list
std::string s = {'c'};
// error: expected ';' at end of declaration
std::vector<int> v{1, 2, 3};
// error: expected '(' for function-style cast or type construction
std::string s = std::string{"s"};
上記の記法はいずれも、C++03以前の古いコンパイラでは対応していない、初期化リスト(initializer list)や統一初期化記法(uniform initialization)という機能を利用している。
C++11以降の規格に対応したコンパイラでコンパイルする必要がある。コンパイラによってはコンパイラフラグとして-std=c++11
を指定することで、C++11を利用することが可能となる場合がある。
// Clang/LLVM
clang++ main.cpp -std=c++11
// GNU/GCC
g++ main.cpp -std=c++11
g++ main.cpp -std=c++0x // GCC 4.6以前の場合
g++ main.cpp -std=gnu++11 // GNU拡張有効時(gnu++11, gnu++0x)
IDEによってはプロジェクト側のC++ Language Dialect
という項目で同等の指定が可能となる場合がある。これを機会にC++11や、より新しい規格であるC++14/C++17への移行を検討してみるのも良いだろう。