Я работаю над приложением, созданным с помощью 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;
}
Редактировать: для пояснения, завершение программы с помощью функции без возврата обычно не вызывает предупреждение о недоступности кода в закрывающей фигурной скобке, заключающей вызов этой функции.
__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