如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的

How is [intro.object]/3 in the C++17 Standard Reference to be understood?

本文关键字:object N4659 intro C++17 何理解 标准 参考      更新时间:2023-10-16

[intro.object]/3(2017 年 3 月后 Kona 工作草案/C++17 DIS(指出:

如果在关联的存储中创建完整对象 ([expr.new]( 与另一个类型为">Nunsigned char数组"或类型为 "的对象e">Nstd​::​byte数组"([cstddef.syn](,该阵列提供存储 对于创建的对象,如果:

(3.1(E的生命周期已经开始,尚未结束,并且

(3.2(新对象的存储完全适合E,并且

(3.3( 没有更小的数组对象可以满足这些 约束。

[ 注意:如果阵列的那部分以前为 另一个对象,该对象的生存期结束,因为它的存储 被重复使用 ([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 (a.a + 8) B;      // a.a provides storage for *b
int *p = new (b->b + 4) int; // b->b provides storage for *p
// a.a does not provide storage for *p (directly),
// but *p is nested within a (see below)

— 结束示例]

  • 这段经文应该如何理解?
    • 这如何解决并与数组的基本内容协调,例如 sizeof(array(?
    • 除了指针之外,数组还为哪些其他完整对象提供存储?

我将欣赏能够展示这里所说的内容的插图,以便我能够完全理解这段文字。

它是如何工作的,并与数组的基本内容协调,例如 sizeof(array(?

该段落所说的内容与数组的sizeof和其他属性之间没有干扰。

除了指针之外,数组还为哪些其他完整对象提供存储?

看来你误解了这些例子。在示例中,通过放置 new 在数组存储中创建多个对象。像往常一样,new返回指向对象的指针,但存储在数组中的是实际对象。

很难更好地解释,因为你的观点都是基于误解。无论如何,以示例的最后一部分为例,稍作修改:

#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的存储中创建的(更具体地说是在Aa成员中(。将对象放置在数组存储中对数组大小没有影响。放置在数组存储中的是一个对象。new(和放置new(返回指向该对象的指针,可以取消引用该指针以获取对实际对象的引用。

相关文章: