次のコードを検討してください。
#include <iostream>
int main()
{
int i{10.1}; // narrowing, should not compile
std::cout << i << std::endl;
}
C++11 標準によれば、コンパイルすべきではありません (ブレースの初期化でのナローイングは禁止されています)。
現在、コンパイルするとg++4.9.2 -std=c++11
警告のみが出力されます
warning: narrowing conversion of '1.01e+1' from 'double' to 'int' inside { } [-Wnarrowing]
フラグを削除する-std=c++11
と、ブレースの初期化に関する警告が表示されますが、縮小は行われません。
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
一方、 g++5はコンパイルしませんg++5 -std=c++11
. ただし、-std=c++11
が省略されている場合でも、g++5
喜んでコンパイルし、ナローイングではなく、ブレースの初期化に関連する警告のみを表示します。
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
上記の振る舞いはバグがあるようでg++4.9
、コードをコンパイルすべきではありませg++5
ん-std=c++11
。これは既知の問題ですか?