2013-10-02 3 views
4

После recent question on static typing, я снова думал о массивах. Я всегда думал, что элементы массива являются просто обычными объектами, но теперь мне интересно:Являются ли элементы массива незавершенными?

Являются ли элементы массива полными объектами сами по себе или являются неполными, а единственным полным объектом является сам массив?

Если это так, то каков полный объект (new T[N])[0], и каков его тип?

Если элемент неполный, значит ли это, что есть объекты, тип которых не может быть известен статически? (Это отличается от базового/полученного бизнеса: тип new Derivedявляется известно статически, хотя он никогда не может быть записана вне этого выражения.)

+0

Что вы подразумеваете под «полным объектом». Моя личная интерпретация слова «объект» - это «блок памяти». Массив будет иметь N кусков памяти, равный sizeof (T). тип элемента массива «Т», вероятно, является реализацией реализации компилятора, но достаточно было бы сказать, что это эффективно «Т», но будет действовать как Т &. – Pete

+0

Я предполагаю, что Ангел объясняет, что в его ответе есть полный объект. – Pete

+0

@Pete: Термин «полный объект» определен на языке. –

ответ

4

Элемент массива не является полным объектом. C++ 11, [intro.object] §2:

Объекты могут содержать другие объекты, называемые подобъектов. Субобъект может быть членом подобъектом (9.2), a подобъектом базового класса (раздел 10) или элементом массива. Объект, который не является подобъектом какого-либо другого объекта, называется полным объектом .

Что касается (new T[N])[0]. Полный объект - это объект, созданный новым выражением (массив T). Я бы сказал, что его тип «массив N элементов T», в соответствии с [expr.new] § 1:

The новое выражение- попытки создать объект типа -ид или new-type-id, к которому он применяется.

Вот, это нового типа-идентификатор, построен из T[N].

Обратите внимание, что при создании массивов новое выражение возвращает указатель на исходный элемент этого массива, а не на сам массив. Это означает, что в таком случае тип нового выражения не является типом полного объекта, который он создает. Другими словами, невозможно получить доступ к типу полного объекта любыми способами.

+1

Но N может отличаться от нуля. – selalerer

+1

@selalerer Упс, я неправильно разобрал круглые скобки. Спасибо за исправление. Я исправлю ответ. – Angew

+1

Отлично, спасибо - мне интересно, что в C++ есть типы, которые не могут быть известны статически, а также, что, похоже, не существует какой-либо возможной операции «завершения объекта». Это чисто теоретическая концепция, которая не может быть реализована как операция внутри языка. –

Смежные вопросы