[英]Reordering member declaration
在C ++標准中有3.3.7 / 1的引號:
如果對類中的成員聲明重新排序會在(1)和(2)下產生一個替代的有效程序,則該程序格式不正確,則不需要診斷。
這是什么意思? 您能否獲得此類重新排序描述的示例?
考慮以下程序:
double foo;
class Bar {
std::vector<decltype(foo)> v;
int foo;
};
重新排列 Bar::v
和Bar::foo
像這樣:
double foo;
class Bar {
int foo;
std::vector<decltype(foo)> v;
};
會產生一個其他有效的替代程序,因此該程序違反了引用的規則。
gcc(的一個版本)選擇在第一種情況下發出錯誤,但使用第二種變型進行編譯(“無需診斷”)。
std::vector<decltype(::foo)> v;
和std::vector<decltype(Bar::foo)> v;
是有效的替代方法(只有在首先聲明Bar::foo
時才可能使用后者)。
這種情況的一個例子是常見錯誤,您可以在對象構造上遇到該錯誤。 代碼變體1和2對此進行了說明。 代碼變體1:
class C
{
C() : a1(0), a2(a1)
{
}
int a1;
int a2;
};
代碼變體2:
class C
{
C() : a1(0), a2(a1)
{
}
int a2;
int a1;
};
請注意,在變體2中,a1和a2成員的聲明順序已更改。 好的編譯器會在代碼變體2上發出警告:“成員初始化與聲明順序不同”。 問題在於,在代碼變體2中,程序行為未定義。 一些編譯器將生成將a2初始化為0的代碼(例如,據我所猜測的是Visual Studio編譯器),一些編譯器將生成其中a2值未定義的代碼,而在代碼變體1中,任何編譯器都將提供正確的代碼。 這就是您需要的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.