6

イニシャライザが情報の損失につながる可能性がある場合、コンパイラが組み込み型の初期化変数を許可する理由を誰かに説明してもらえますか?

たとえば、第5版のC ++ Primerによると、初期化子によって情報が失われる可能性がある場合、コンパイラーは組み込み型の初期化変数をリストしません

しかし、私のコンパイラgcc v 4.7.1aは、次のコードで変数を正常に初期化しました。

long double ld = 3.1415926536; 
int a{ld};

警告がありました:{}[-Wnarrowing]内で'ld'の変換を'longdouble'から'int'に狭めています。

4

3 に答える 3

11

初期化子リストの機能の1つは、変換を絞り込むことができないことです。しかし、言語定義は警告とエラーを区別しません。コードの形式が正しくない場合は、「診断」が必要です。これは、実装で定義された一連のメッセージからのメッセージとして定義されます。警告はこの要件を満たしています。これが非標準の拡張機能のメカニズムです。警告を発行すると、コンパイラは、実装固有のルールに従って何かをコンパイルするなど、やりたいことを自由に実行できます。

于 2012-10-13T14:28:03.827 に答える
2

コンパイラフラグを設定して、すべての警告にエラーのフラグを立てることができます。その場合、それだけがあなたがそのようにするのを止めます。それ以外の場合は、警告のみになります。

于 2012-10-13T14:17:07.817 に答える
0

この問題は最近発生しています。gcc-4.7では、コマンドラインスイッチが必要な動作をオンにします。

g++ -Werror=narrowing ...
于 2012-10-13T14:23:09.973 に答える