2013-06-20 7 views
7

明らかに狭い変換が見つかったという難解な状況に遭遇しましたが、コンパイラ(gcc-4.7.2)が-Wall -Wnarrowing -pedanticフラグにもかかわらず警告を出さないというのは残念です。以下のプログラムを参照してください。a1カッコで初期化するときに、狭めの警告が出ない

struct A { 
    int m; 
    A(int m) : m(m) {}; 
}; 

int main() { 
    unsigned long v = 0; 
    A a1(v); // narrowing, but no warning (should this not cause a warning?) 
    A a2{v}; // narrowing, warning raised (expected) 
} 

初期化は、コンパイラからののぞき見などはあまりせずに飛ぶように思われます。私が狂っていないことを確かめるために、同じ方法でa1を初期化しようとしましたが、括弧ではなく中括弧で囲んでいます。コンパイラは、2番目のケースでは、期待通りに絞り込みを警告します。

明確にする:私は、初期化リストのコンバージョンを狭めることの合法性については問いません。私はそれが合法ではないことを知っています - a2の中括弧で囲まれた初期化は単なる健全性チェックでした。 私の質問は初期化リストとは無関係です。これは重複する質問ではありません。

コンパイラは、a1の初期化のための絞り込みについて警告しませんか?

+0

'a1'のコンストラクタは1回の暗黙の変換を行うことができますが、' a2'は暗黙の変換を行うことができません。なぜ彼らは同じでなければならないと思いますか? –

+1

'-Wconversion'フラグを追加するとどうなりますか? –

+0

これは重複していません。初期化リスト内のコンバージョンを狭めることは違法であることは既に認識しています。私はカッコで初期化を尋ねています。 –

答えて

2

Wsign-conversionは、コードのその行のための警告を生成する - -Wconversionunsigned longintは(多くのプラットフォーム上で真であり、さらにいくつかの64ビット・プラットフォーム)と同じ大きさを持っていない場合。 Cコードの場合、-Wconversionは暗黙的に-Wsign-conversionを有効にしますが、何らかの理由でC++では発生しません。

もしlong longvの種類を変更する場合、単独で-Wconversion警告(intが32ビットであると仮定して)生成します。

+0

ありがとうございました。私はイニシャライザのリストのセマンティクスが変換に関して非常に具体的であることをうれしく思っています - これは、私が実際にターゲットにする前にコンパイラが変換の落とし穴を捕まえることができるように、新しいプラットフォーム。 –

関連する問題