在recent question on static typing之后,我再次考虑阵列。我一直认为数组元素只是普通的对象,但现在我想知道:
数组元素本身是完整对象,还是不完整,唯一完整的对象是数组本身?
如果是这种情况,那么(new T[N])[0]
的完整对象是什么,它的类型是什么?
如果元素不完整,那么这是否意味着有完整的对象,其类型无法静态知道? (这与基础/派生业务不同:new Derived
的类型是静态已知的,但它可能永远不会被记录在该表达式之外。)
答案 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 的类型不是它创建的完整对象的类型。换句话说,无法通过任何方式访问完整对象的类型。