在最近关于静态类型的问题之后,我再次考虑数组。我一直认为数组元素只是普通的对象,但现在我想知道:
数组的元素本身是完整的对象,还是它们不完整,唯一完整的对象是数组本身?
如果是这样的话,那么完整的对象是什么?(new T[N])[0]
什么,它的类型是什么?
如果元素不完整,那么这是否意味着存在无法静态知道类型的完整对象?(这与基础/派生业务不同:类型new Derived
是静态已知的,尽管它可能永远不会记录在该表达式之外。)
在最近关于静态类型的问题之后,我再次考虑数组。我一直认为数组元素只是普通的对象,但现在我想知道:
数组的元素本身是完整的对象,还是它们不完整,唯一完整的对象是数组本身?
如果是这样的话,那么完整的对象是什么?(new T[N])[0]
什么,它的类型是什么?
如果元素不完整,那么这是否意味着存在无法静态知道类型的完整对象?(这与基础/派生业务不同:类型new Derived
是静态已知的,尽管它可能永远不会记录在该表达式之外。)
数组元素不是一个完整的对象。C++11,[intro.object]§2:
对象可以包含其他对象,称为子对象。子对象可以是成员子对象(9.2)、基类子对象(第 10 条)或数组元素。不是任何其他对象的子对象的对象称为完整对象。
至于(new T[N])[0]
. 完整的对象是由new-expression创建的对象(一个数组T
)。我会说它的类型是“N
元素数组T
”,根据 [expr.new]§1:
new-expression尝试创建应用它的type-id或new-type-id的对象。
在这里,它是一个新类型 ID,由T[N]
.
请注意,在创建数组时,new 表达式返回指向该数组初始元素的指针,而不是数组本身。这意味着在这种情况下,新表达式的类型不是它创建的完整对象的类型。换句话说,无法通过任何方式访问完整对象的类型。