数组元素是不完整的对象?

时间:2013-10-02 08:16:00

标签: c++ language-lawyer

recent question on static typing之后,我再次考虑阵列。我一直认为数组元素只是普通的对象,但现在我想知道:

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

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

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

1 个答案:

答案 0 :(得分:4)

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

  

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

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

  

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

在这里,它是由T构建的 new-type-id,

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