Статический или динамический тип используется для «sizeof expr»?

Это статический или динамический тип expr используется для sizeof expr?

Пожалуйста, приведите стандарт C ++ 17.

0

Решение

[Expr.sizeof] / 1 говорит

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

Вот тип является терминологией, а тип выражения определяется в каждом подпункте из [expr], и вы можете видеть, что это всегда относится к статическому типу.

Например, рассмотрим

struct Base {};
struct Derived : Base {};
Base *pb = new Derived;
auto s = sizeof(*pb);

В этом примере результат sizeof(*pb) это тип *pb в соответствии с [expr.sizeof] / 1. Чтобы увидеть, что тип *pbмы переходим к [Expr.unary.op] / 1:

… Если тип выражения «указатель на T», тип результата «T».

Затем мы переходим к [Expr.prim.id.unqual] / 2:

Результатом является объект, обозначенный идентификатором. … В противном случае тип выражения является типом результата.

Сущность, обозначенная pb является объектом типа указателя на Baseи то же самое выражение pbтак что тип *pb является BaseТаким образом, результат sizeof(*pb) это размер Base,

5

Другие решения

Обратитесь к ссылке для sizeof.

В частности:

Применительно к выражению, sizeof не оценивает выражение, и даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения.

Это более читаемая версия следующих цитат из стандарта C ++ ([Expr.sizeof]):

Операнд является либо выражением, которое является неоцененным операндом (раздел 8), либо заключенным в скобки тип-идентификатор.

Результат применения sizeof подобъекту базового класса является размер типа базового класса.

6

По вопросам рекламы [email protected]