明らかに狭い変換が見つかったという難解な状況に遭遇しましたが、コンパイラ(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
の初期化のための絞り込みについて警告しませんか?
'a1'のコンストラクタは1回の暗黙の変換を行うことができますが、' a2'は暗黙の変換を行うことができません。なぜ彼らは同じでなければならないと思いますか? –
'-Wconversion'フラグを追加するとどうなりますか? –
これは重複していません。初期化リスト内のコンバージョンを狭めることは違法であることは既に認識しています。私はカッコで初期化を尋ねています。 –