Pracuję nad aplikacją zbudowaną za pomocą VC9 i trafiłem na ostrzeżenie, którego nie w pełni rozumiem: dlaczego jest ostrzeżenie "nieosiągalny kod" na klamrze zamykającej konstruktor?Nieosiągalny kod na klamrze zamykającej konstruktora
Minimalna testcase odtworzyć problem jest:
__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;
}
To musi być skompilowany z/W4, aby wywołać ostrzeżenie. Alternatywnie możesz skompilować z/we4702, aby wymusić błąd w wykryciu tego ostrzeżenia.
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
Może ktoś wyjaśnić, co dokładnie jest nieosiągalny tutaj? Moja najlepsza teoria mówi, że to destruktor, ale chciałbym uzyskać ostateczną odpowiedź.
Jeśli chcę, aby ten kod był ostrzeżony, jak mogę to osiągnąć? Najlepsze, co mogę wymyślić, to przekonwertować to na błąd podczas kompilacji.
struct A {
private:
A(); // No, you can't construct this!
};
int main() {
A a;
}
Edit: o wyjaśnienie, kończąc program z funkcją noreturn zwykle nie powodują nieosiągalny kod ostrzegawczy na nawiasu zamykającego zamykającego że wywołanie funkcji.
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
}
~A() {
foo();
}
};
int main() {
A a;
}
Wyniki w:
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
Ponieważ kończysz program w 'foo()'? – juanchopanza
Wykonywanie czegoś "prywatnego", a nie implementowanie go to zwykły sposób, ** C++ 11 ** ma '= delete', aby to osiągnąć. –
musi 'foo()' być '__declspec (noreturn)'? – ixe013