C++ 理解C++;标准&x27;s对“的解释”;“对象创建”&引用;“对象类型”;和C的区别

C++ 理解C++;标准&x27;s对“的解释”;“对象创建”&引用;“对象类型”;和C的区别,c++,c,c++11,object,language-lawyer,C++,C,C++11,Object,Language Lawyer,我最近开始阅读C++standard(),以更好地理解该语言并避免与UB相关的陷阱。我知道这可能是一个非常基本的问题,坦率地说,但是我还没有找到一个很好的答案来解释这些概念。也许每个人都明白,而我却不明白 考虑以下来自[intro.object]/1的文本 对象是一个存储区域。[…]对象由定义(3.1)创建 嗯[basic.def]/2详细介绍了定义。 在需要时通过实施(12.2) 我猜创建的临时表也包含在其中。 通过新表达式(5.3.4)或 [expr.new]介绍了这一点,尽管我还没

我最近开始阅读
C++
standard(),以更好地理解该语言并避免与
UB
相关的陷阱。我知道这可能是一个非常基本的问题,坦率地说,但是我还没有找到一个很好的答案来解释这些概念。也许每个人都明白,而我却不明白

考虑以下来自[intro.object]/1的文本

对象是一个存储区域。[…]对象由定义(3.1)创建

[basic.def]/2详细介绍了定义。

在需要时通过实施(12.2)

我猜创建的临时表也包含在其中。

通过新表达式(5.3.4)或

[expr.new]介绍了这一点,尽管我还没有读过。

进一步的[basic.life]/1说明:

类型为T的对象的生存期始于:

-获得T型的适当对齐和尺寸的存储,以及

现在考虑下面的例子:

int *x = (int*)(operator new (10*sizeof(int)));         // (1a) How many objects are created? Does allocated storage has a type?
::new ((void*)x) int[10]{};                             // (2a) How many objects are created? What is/are the type/s?
关于(1a),我认为是一个
x
是使用
int*
类型创建的
存储分配不构成对象创建,类型是对象的属性

关于(2a),我认为是十个
int
类型的对象
另外,由于指针返回到第一个对象,使用指针算法访问其他9个对象是否定义良好? 这是否也意味着,如果我知道
T
类型的对象位于地址
A
,我可以使用cast访问对象的值,并且它是定义良好的

// How many objects does (1b) & (2b) create? What is/are the type/s?
// Does (1b) or (2b) invoke UB because of those extra 3 bytes?
int *y = (int*)(operator new (10*sizeof(int) + 3));     // (1b) - notice extra "+ 3" as part of size
::new ((void*)y) int[10]{};                             // (2b)

“placement new”是在
C++
中构造/重用动态分配对象的唯一方法吗

由于
C
在分配完成后没有用于构建对象的“新放置”,因此
C++
在这方面是否与
C
兼容?
C
中的
对象是否与
C++
中的对象相同(除非
C++
具有类类型)


C++
中动态分配对象(以及确定其类型)的对象创建与
C
有何不同?

本文介绍了C++20之前的情况,以及C++20解决问题的方法。还有一个高度相关的Q&A@StoryTeller UnslanderMonica:感谢链接,我会仔细阅读。@StoryTeller UnslanderMonica问题是接受了错误的答案一个对象是一个长期不正确的存储区域:)-这篇论文涵盖了C++20之前的情况,以及C++20解决问题的方法。还有一个高度相关的问题&a@StoryTeller UnslanderMonica:谢谢链接,“我会仔细检查的。@StoryTeller UnslanderMonica问题是接受了错误的答案一个对象是一个存储区域,很长一段时间都不正确:)