![](/img/trans.png)
[英]Can I apply the final keyword to a POD (standard-layout) struct in C++11 ? Should I?
[英]c++11 standard-layout - using same access control
我認為 PODs (c++11, trivial + standard-layout) 的重點是確保類型與 C 兼容。
鑒於以下代碼:
// that one is a standard layout, and trivial which makes it a c++11 POD
struct Bar
{
public:
int x;
public:
int y;
};
AFAIU,編譯器可能會重新排序 x 和 y。 這不會破壞與 C 的兼容性嗎?
為什么在 c++11 中放寬 98/03 POD 定義被認為是一個好主意?
AFAIU,編譯器可能會重新排序 x 和 y。 這不會破壞與 C 的兼容性嗎?
在 C++03 中,它可以。 在 C++11 中它不能。 C++11 的標准布局規則只要求所有成員具有相同的訪問控制。 它們不必在同一個訪問控制區域中聲明。
為什么在 c++11 中放寬 98/03 POD 定義被認為是一個好主意?
我認為你誤解了一些事情。 C++11 規則允許更多類型成為標准布局(因此可能與 C 類型布局兼容),而不是更少。 因此,放寬規則並沒有真正的缺點。
我認為 PODs (c++11, trivial + standard-layout) 的重點是確保類型與 C 兼容。
不完全是它的全部意義,但是,這是 POD 的特性之一。
// that one is a standard layout, and trivial which makes it a c++11 POD
正確的。
AFAIU,編譯器可能會重新排序 x 和 y。 這不會破壞與 C 的兼容性嗎?
我們已經確定它是一個 POD,這意味着編譯器將保持與 C 的兼容性。保持與 C 的兼容性並不會破壞與 C 的兼容性。
為什么在 c++11 中放寬 98/03 POD 定義被認為是一個好主意?
因為它不會破壞任何東西。
POD 的重點不僅僅是確保類型與 C 兼容 - 請注意,具有訪問說明符( public
、 private
等)的類型根據定義與 C 不兼容,因為 C 沒有訪問說明符。 POD 類型的主要屬性是它可以被內存化。
在 C++ 類型中擁有多個訪問說明符確實允許編譯器以非指定的方式布置類型,這已經有一段時間了(這不是 C++11 的新內容):
從 C++03 9.2/12
沒有中間訪問說明符聲明的(非聯合)類的非靜態數據成員被分配,以便后面的成員在類對象中具有更高的地址。 由訪問說明符分隔的非靜態數據成員的分配順序未指定 (11.1)。
但是,這並不會使類型成為非 POD - 它仍然可以是 POD,只是不能用 C 可移植地表達。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.