¿Estoy leyendo el estándar correctamente en 5.2.8.3: ... If the type of the expression is a class type, the class shall be completely-defined.
Si el tipo no está "completamente definido" ¿significa eso que el siguiente programa no está definido?¿Está utilizando typeid en un comportamiento indefinido de tipo declarado hacia adelante?
foo.cpp:
struct foo
{
virtual void a(){}
};
struct bar : foo
{
virtual void a(){}
};
bar abar;
foo& get_some_foo()
{
return abar;
}
main.cpp:
#include <iostream>
#include <typeinfo>
struct foo;
foo& get_some_foo();
int main()
{
foo& a_ref_foo(get_some_foo());
std::cout << "a_ref_foo typeid name: " << typeid(a_ref_foo).name() << std::endl;
return 0;
}
MSVC10 salidas: `a_ref_foo typeid nombre: struct foo'
En este caso, el uso de "deberá" significa que está mal formado, porque esta es una regla diagnosticable (es decir, no se dice que "no se requiere diagnóstico" y no se describe explícitamente como un comportamiento indefinido). –
@ R.MartinhoFernandes: Gracias, he actualizado la respuesta. (El estándar C, con el que estoy más familiarizado, usa "shall" de manera diferente, una violación de un "shall" que no está en una * constraint explícita * hace que el comportamiento del programa sea indefinido. Las reglas de C++ están cubiertas en la sección 1.4, " Cumplimiento de la implementación ".) –
Su suposición acerca de los incluidos fue correcta. Lo siento por eso. También probé gcc y obtuve los mismos errores. Su interesante MSVC 10 con w4 ni siquiera advierte. – Zac