Это статический или динамический тип expr
используется для sizeof expr
?
Пожалуйста, приведите стандарт C ++ 17.
[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
,
Обратитесь к ссылке для sizeof
.
В частности:
Применительно к выражению,
sizeof
не оценивает выражение, и даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения.
Это более читаемая версия следующих цитат из стандарта C ++ ([Expr.sizeof]):
Операнд является либо выражением, которое является неоцененным операндом (раздел 8), либо заключенным в скобки тип-идентификатор.
Результат применения
sizeof
подобъекту базового класса является размер типа базового класса.