Sto leggendo lo standard correttamente in 5.2.8.3: ... If the type of the expression is a class type, the class shall be completely-defined.
Se il tipo non è "completamente definito" vuol dire che il seguente programma non è definito?Sta usando typeid su un comportamento non definito di tipo forward dichiarato?
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 uscite: `a_ref_foo typeid nome: struct foo'
In questo caso, l'uso di "deve" significa che è mal formato, perché questa è una regola diagnosticabile (vale a dire, non è detto che "non è richiesta alcuna diagnostica" e non è esplicitamente descritto come comportamento non definito). –
@ R.MartinhoFernandes: Grazie, ho aggiornato la risposta. (Lo standard C, con il quale sono più familiare, usa "deve" diversamente: una violazione di "deve" che non è in un vincolo * esplicito * rende il comportamento del programma non definito. Le regole C++ sono trattate nella sezione 1.4, " Conformità all'implementazione ".) –
La tua ipotesi su include era corretta. Mi dispiace per quello Ho anche appena provato su gcc e ho avuto gli stessi errori. Il suo interessante MSVC 10 con w4 non avvisa nemmeno. – Zac