4

最近关于静态类型的问题之后,我再次考虑数组。我一直认为数组元素只是普通的对象,但现在我想知道:

数组的元素本身是完整的对象,还是它们不完整,唯一完整的对象是数组本身?

如果是这样的话,那么完整的对象是什么?(new T[N])[0]什么,它的类型是什么?

如果元素不完整,那么这是否意味着存在无法静态知道类型的完整对象?(这与基础/派生业务不同:类型new Derived 静态已知的,尽管它可能永远不会记录在该表达式之外。)

4

1 回答 1

4

数组元素不是一个完整的对象。C++11,[intro.object]§2:

对象可以包含其他对象,称为子对象。子对象可以是成员子对象(9.2)、基类子对象(第 10 条)或数组元素。不是任何其他对象的子对象的对象称为完整对象。

至于(new T[N])[0]. 完整的对象是由new-expression创建的对象(一个数组T)。我会说它的类型是“N元素数组T”,根据 [expr.new]§1:

new-expression尝试创建应用它的type-idnew-type-id的对象。

在这里,它是一个新类型 ID,T[N].

请注意,在创建数组时,new 表达式返回指向该数组初始元素的指针,而不是数组本身。这意味着在这种情况下,新表达式的类型不是它创建的完整对象的类型。换句话说,无法通过任何方式访问完整对象的类型。

于 2013-10-02T08:34:03.493 回答