[英]Rule of reordering member declaration in class
我正在閱讀c ++ 14 N3797,我遇到了3.3.7 / 1:
如果類中的重新排序成員聲明在(1)和(2)下產生備用有效程序,則程序格式錯誤,不需要診斷。
有(1)和(2):
1)在類中聲明的名稱的潛在范圍不僅包括名稱的聲明點后面的聲明性區域,還包括所有函數體,默認參數,異常規范和非支撐或等於初始值的聲明區域。該類中的靜態數據成員(包括嵌套類中的這些內容)。
2)在S類中使用的名稱N應在其上下文中引用相同的聲明,並在完成的S范圍內重新評估。違反此規則不需要診斷。
那就是我們寫下面的內容:
class A
{
int a;
int b;
}
然后該計划形成不良。 重新成員聲明會產生一個備用的有效程序:
class A
{
int b;
int a;
}
我可能不正確理解這個規則嗎?
“備用有效程序”指的是這樣一種情況,其中類中元素的每個排序產生對程序的有效解釋,但含義根據順序而改變 。
在您的情況下,允許更改a
和b
的順序, 但由於它們的相對順序不會影響程序的含義,因此定義了行為。
為此,您必須在類中使用已在類外部定義其他含義的名稱。 例如:
typedef void *T;
struct whatever {
T a;
typedef long T;
};
這里, a
的聲明和T
的typedef的相對順序會影響代碼的含義。 正如它現在所寫, a
類型為void *
,因為全局typedef void *T;
在T a;
范圍內T a;
被解析。
但是,如果我們重新排列這兩個,那么:
typedef void *T;
struct whatever {
typedef long T;
T a;
};
...... T a;
等於long a;
。 由於兩個聲明的相對順序,程序的含義是不同的,因此行為是未定義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.