Недостижимый код в закрывающей скобке конструктора

Я работаю над приложением, созданным с помощью 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
7
задан mrkj 30 May 2012 в 14:47
поделиться