簡體   English   中英

如何理解 C++17 標准參考中的 [intro.object]/3?

[英]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 ”或“ N std::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)?
    • 除了指針,arrays 還為哪些其他完整對象提供存儲?

我將欣賞能夠展示這里所說的內容的插圖,以便我能夠完全理解這段文字。

這如何解決並與 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 (更具體地說是在Aa成員中)。 在 arrays 存儲中放置 object 對 arrays 大小沒有影響。 arrays 存儲中放置的是 object。 new (和放置new )返回指向 object 的指針,可以取消引用以獲取對實際 object 的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM