gpt4 book ai didi

c++ - 数组元素和指针值上的新布局

转载 作者:行者123 更新时间:2023-12-01 14:07:38 25 4
gpt4 key购买 nike

考虑以下三个程序:

// program 1

#include<new>

struct A {
const int a = 0;
int b = 0;
};

int main() {
auto a = new A[2];
new(a+1) A;
a[1].b = 1;
}
// program 2

#include<new>

struct A {
const int a = 0;
int b = 0;
};

int main() {
auto a = new A[2];
new(a) A;
a[0].b = 1;
}
// program 3

#include<new>

struct A {
const int a = 0;
int b = 0;
};

int main() {
auto a = new A[2];
new(a) A;
a->b = 1;
}

这些程序在 C++17 中有未定义的行为吗?

我看到的问题是根据 [basic.life]/8指针不会自动引用新的 A我通过placement-new 创建的对象。 std::launder需要明确地实现这一点。因此,成员访问将具有未定义的行为,因为它是在其生命周期之外的对象上完成的。

至少对于程序 3,这对我来说似乎很清楚,但是对于程序 1,根据 [intro.object]/2新创建的对象成为数组的子对象,因此应该通过指针算法来访问它,不是吗?

然后程序 2 也不会有未定义的行为,因为指针算法只需要 a指向数组的一个元素,不一定在其生命周期内。

最佳答案

我相信[basic.life]/8.3

the type of the original object is not const-qualified, and, if a class type, does not contain any non-static data member whose type is const-qualified or a reference type, and



是使您的成员访问代码未定义行为的唯一子句。

在所有三种情况下 a是两个数组的名称 A对象,因此成员访问是可以的,因为您使用的是 A访问 A 的指针目的。您没有将字符缓冲区视为 A ,您正在治疗 AA这是允许的。

关于c++ - 数组元素和指针值上的新布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61086391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com