Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ [intro.object]/3在C++;17需要理解的标准参考?_C++_Language Lawyer - Fatal编程技术网

C++ [intro.object]/3在C++;17需要理解的标准参考?

C++ [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)没有更小的数组对象满足这些条件 限制 [ 注意:如果以前为存储提供了阵列的该部分 另一个对象,该对象的生存期结束,因为它的

N4659号文件(2017年3月后Kona工作草案/C++17 DIS)规定:

如果在关联的存储中创建了完整的对象([expr.new]) 与另一个类型为“N
无符号字符数组”或类型为
“N
std的数组​::​字节([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谢谢,非常有用。