VC9で構築されたアプリケーションで作業していますが、私は完全に理解していないという警告が表示されました。なぜ閉じることができないのですか?コンストラクタ?問題を再現するコンストラクタの閉じ括弧に到達できないコード
最小限のテストケースは次のとおりです。
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
foo();
} // d:\foo.cpp(7) : warning C4702: unreachable code
};
int main() {
A a;
}
これは警告をトリガするために/ W4でコンパイルする必要があります。または、/ we4702を使用してコンパイルして、この警告の検出時にエラーを強制することもできます。
d:\>cl /c /W4 foo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo.cpp
d:\foo.cpp(7) : warning C4702: unreachable code
誰かが、正確には、ここに到達不能であるかを説明することはできますか?私の最高の理論は、それがデストラクタだということですが、私は決定的な答えをしたいと思います。
このコードを警告クリアにしたい場合、どうすればいいですか?私が思いつくのは、これをコンパイル時のエラーに変換することです。
struct A {
private:
A(); // No, you can't construct this!
};
int main() {
A a;
}
編集:明確化のため、noreturn機能を使用してプログラムを終了すると、通常、その関数呼び出しを囲む閉じ括弧の到達不能コードの警告が発生することはありません。
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
}
~A() {
foo();
}
};
int main() {
A a;
}
での結果:
d:\>cl /c /W4 foo3.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo3.cpp
あなたは 'foo()'でプログラムを終了させるので? – juanchopanza
'private'を作り、それを実装しないのが普通の方法です。** C++ 11 **はそれを達成するために' = delete'を持っています。 –
は 'foo()'を '__declspec(noreturn)'にする必要がありますか? – ixe013