次のコードを試しました:
int main()
{
int x {23.22};
}
ナローイングが必要な初期化が含まれていますが、コードはエラーや警告なしで正常にコンパイルされます。一方、次のコードではエラーが発生します。
int main()
{
int x[]{23.22};
}
バグを見つけましたか?
PS: 現在 GCC 4.5.0 を使用しています
バグのように見えます。以下は、ドラフト n3092 からの抜粋です。
8.5.4 リストの初期化
— それ以外の場合、イニシャライザ リストに 1 つの要素がある場合、オブジェクトはその要素から初期化されます。要素を T に変換するために縮小変換 (以下を参照) が必要な場合、プログラムは不適切な形式です。
int x1 {2}; // OK
int x2 {2.0}; // error: narrowing
GCC の C++0X 準拠については、こちらを参照してください。Initializer Lists ( N2672 ) のステータスは「はい」ですが、これは単なる実験的なものであることに注意してください (したがって、バグが発生する可能性があります)。
バグ レポートからの更新: GCC は-Wconversion
フラグ付きの警告を出力します (これは でカバーされていません-Wall
)。
C++0x のサポートはまだ実装されているため、標準に従ってエラーや警告が発生するはずであり、実際に発生していなくても、必ずしもバグではなく、まだ実装されていません。これは、特定の機能が実装されてからドラフト規格が変更された場合にも発生する可能性があります。
進行中のソフトウェアまたは標準で作業するという事実は、最新の仕様に従って存在すると想定されているものが存在しないということです。