C++ [intro.object]/3在C++;17需要理解的标准参考?
N4659号文件(2017年3月后Kona工作草案/C++17 DIS)规定: 如果在关联的存储中创建了完整的对象([expr.new]) 与另一个类型为“NC++ [intro.object]/3在C++;17需要理解的标准参考?,c++,language-lawyer,C++,Language Lawyer,N4659号文件(2017年3月后Kona工作草案/C++17 DIS)规定: 如果在关联的存储中创建了完整的对象([expr.new]) 与另一个类型为“N无符号字符数组”或类型为 “Nstd的数组::字节([cstddef.syn]),该数组提供存储 对于创建的对象,如果: (3.1)e的寿命已开始,但尚未结束,以及 (3.2)新对象的存储完全适合e,并且 (3.3)没有更小的数组对象满足这些条件 限制 [ 注意:如果以前为存储提供了阵列的该部分 另一个对象,该对象的生存期结束,因为它的
无符号字符数组”或类型为
“Nstd的数组::字节([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)
模板
结构对齐{
alignas(T…)无符号字符数据[max(sizeof(T…)];
};
int f(){
非洲联盟;
int*p=new(au.data)int;//好的,au.data提供存储
char*c=new(au.data)char();//确定,结束*p的生存期
char*d=new(au.data+1)char();
返回*c+*d;//确定
}
结构A{无符号字符A[32];};
结构B{无符号字符B[16];};
A A;
B*B=new(a.a+8)B;//a.a为*B提供存储
int*p=new(b->b+4)int;//b->b为*p提供存储
//a.a不为*p(直接)提供存储,
//但是*p嵌套在a中(见下文)
- [结束示例]
- 这篇课文应该如何理解?
- 这是如何实现的,并与数组的基本内容(例如sizeof(数组))相协调
- 除了指针,数组还为哪些完整对象提供存储
我将非常感谢能够演示此处所述内容的插图,以便我能够完全理解本文
这是如何实现的,并与数组的基本内容(例如sizeof(数组))相协调
该段落所述内容与sizeof
以及数组的其他属性之间不存在干扰
除了指针,数组还为哪些完整对象提供存储
您似乎误解了示例。在示例中,通过placement 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();
}
#包括
结构A{无符号字符A[32];};
结构B{
无符号字符b[16];
void hello_world(){
如果您参考示例并解释其中哪些部分不清楚,您需要告诉我们哪些部分您不清楚。什么是sizeof(array)和任何事情有关?你在哪里得到数组存储指针?我对你的困惑感到困惑。如果你是C++新手,正在尝试通过阅读标准来学习C++,那么不要!这个标准不是用来教的,而且是非常糟糕的工具。你应该在Y之后才开始阅读标准。对“C++”有一个很好的理解,“完整对象”是在数组存储中通过<代码>新< /代码>创建的,它是一个“代码< int /<代码>,2代码> char s,然后是一个<代码> b>代码>和一个<代码> int >代码>(没有指针BTW),非常感谢!但是这部分如何理解?(3.3)没有更小的数组对象满足这些约束。@octopus我希望你不要问,因为我完全不知道这是什么意思:P@octopus@LanguageLawyer谢谢,非常有用。@LanguageLawyer谢谢,非常有用。