我是否在5.2.8.3: ... If the type of the expression is a class type, the class shall be completely-defined.
中正確讀取標準如果類型不是「完全定義」,那麼這是否意味着下面的程序是未定義的?在前向聲明類型未定義行爲上使用typeid?
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輸出:`a_ref_foo typeid的名字:結構富」
在這種情況下,使用「shall」意味着它是不合格的,因爲這是一個可診斷的規則(即,並不是說「不需要診斷」並且沒有明確描述爲未定義的行爲)。 –
@ R.MartinhoFernandes:謝謝,我已經更新了答案。 (我更熟悉的C標準使用「應」不同;違反「不應該」在明確的*約束下*使程序的行爲不確定C++規則在第1.4節「執行合規「。) –
你對包含的假設是正確的。對於那個很抱歉。我也只是嘗試了gcc並得到了相同的錯誤。它有趣的MSVC 10與W4甚至沒有警告。 – Zac