[英]How is [intro.object]/3 in the C++17 Standard Reference to be understood?
N4659 的[intro.object]/3 (2017 年 3 月 Kona 后工作草案/C++17 DIS)指出:
如果一個完整的 object 被創建([expr.new])在與另一個 object e類型“ N
unsigned char
”或“ Nstd::byte
”([cstddef.syn])類型的數組關聯的存儲中,則陣列為創建的 object 提供存儲,如果:(3.1) e的生命周期已經開始但沒有結束,並且
(3.2) 新 object 的存儲完全適合e ,並且
(3.3) 沒有更小的數組 object 可以滿足這些約束。
[注意:如果陣列的該部分先前為另一個 object 提供了存儲,則該 object 的生命周期將結束,因為它的存儲已被重用([basic.life])。 ——尾注]
[例子:
template<typename...T> struct AlignedUnion { alignas(T...) unsigned char data[max(sizeof(T)...)]; }; int f() { AlignedUnion<int, char> au; int *p = new (au.data) int; // OK, au.data provides storage char *c = new (au.data) char(); // OK, ends lifetime of *p char *d = new (au.data + 1) char(); return *c + *d; // OK } struct A { unsigned char a[32]; }; struct B { unsigned char b[16]; }; A a; B *b = new (aa + 8) B; // aa provides storage for *b int *p = new (b->b + 4) int; // b->b provides storage for *p // aa does not provide storage for *p (directly), // but *p is nested within a (see below)
——結束示例]
我將欣賞能夠展示這里所說的內容的插圖,以便我能夠完全理解這段文字。
這如何解決並與 arrays 的基本內容相協調,例如 sizeof(array)?
該段落所說的內容與數組的sizeof
和其他屬性之間沒有干擾。
除了指針,arrays 還為哪些其他完整對象提供存儲?
看來你誤解了這些例子。 在示例中,通過放置 new 在 arrays 存儲中創建了幾個對象。 像往常一樣new
返回指向 object 的指針,但存儲在 arrays 中的是實際對象。
很難更好地解釋,因為您的觀點都是基於誤解。 無論如何,將示例的最后一部分稍作修改:
#include <iostream>
struct A { unsigned char a[32]; };
struct B {
unsigned char b[16];
void hello_world() {
std::cout << "hello world";
}
};
int main() {
A a;
B *b = new (a.a + 8) B; // a.a provides storage for *b
std::cout << sizeof(a.a) << "\n";
std::cout << sizeof(b->b) << "\n";
B& bref = *b;
bref.hello_world();
}
這里B
是在 A 的存儲中創建A
(更具體地說是在A
的a
成員中)。 在 arrays 存儲中放置 object 對 arrays 大小沒有影響。 arrays 存儲中放置的是 object。 new
(和放置new
)返回指向 object 的指針,可以取消引用以獲取對實際 object 的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.