Estoy trabajando en una aplicación creada con VC9 y he visto una advertencia que no entiendo completamente: ¿por qué hay un aviso de "código inalcanzable" en la llave de cierre del ¿constructor?Código inalcanzable en la llave de cierre del constructor
El caso de prueba mínima para reproducir el problema es:
__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;
}
Esto se debe compilar con/W4 para activar la alerta. Alternativamente, puede compilar con/we4702 para forzar un error en la detección de esta advertencia.
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
Puede alguien explicar lo que, precisamente, es inalcanzable aquí? Mi mejor teoría es que es el destructor, pero me gustaría obtener una respuesta definitiva.
Si quiero hacer que este código advierta, ¿cómo puedo lograrlo? Lo mejor que se me ocurre es convertir esto a un error en tiempo de compilación.
struct A {
private:
A(); // No, you can't construct this!
};
int main() {
A a;
}
Editar: de aclaración, que termina el programa con una función NoReturn normalmente no causa un código inalcanzable advertencia en la llave de cierre que encierra dicha llamada de función.
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
}
~A() {
foo();
}
};
int main() {
A a;
}
Resultados en:
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
Porque termina el programa en 'foo()'? – juanchopanza
Hacer algo 'privado' y no implementarlo es la forma habitual, ** C++ 11 ** tiene '= eliminar' para lograr eso. –
debe 'foo()' ser '__declspec (noreturn)'? – ixe013