如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
How is [intro.object]/3 in the C++17 Standard Reference to be understood?
[intro.object]/3(2017 年 3 月后 Kona 工作草案/C++17 DIS(指出:
如果在关联的存储中创建完整对象 ([expr.new]( 与另一个类型为">N
unsigned 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
的存储中创建的(更具体地说是在A
的a
成员中(。将对象放置在数组存储中对数组大小没有影响。放置在数组存储中的是一个对象。new
(和放置new
(返回指向该对象的指针,可以取消引用该指针以获取对实际对象的引用。
相关文章:
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- WebKit2GTK+ "window-object-cleared"未清除
- 返回 *&object 时是否允许复制/移动省略?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 根据标准,究竟什么是"declaration of an object"
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>