私は 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