静态或动态类型用于“ sizeof expr”?

时间:2018-08-06 09:50:52

标签: c++ language-lawyer c++17 sizeof static-typing

expr使用的是静态类型还是动态类型的sizeof expr

请引用C ++ 17标准。

2 个答案:

答案 0 :(得分:6)

请参考sizeof的参考。

特别是:

  

应用于表达式时,sizeof不会对表达式求值,即使表达式指定了多态对象,结果也就是表达式的静态类型的大小。

这是C ++标准( [expr.sizeof] )中以下引号的更易读的版本:

  

操作数可以是一个表达式,它是一个未求值的操作数(第8条),也可以是带括号的 type-id

  

sizeof应用于基类子对象的结果是基类类型的大小。

答案 1 :(得分:5)

[expr.sizeof]/1

  

sizeof运算符得出其操作数类型的非潜在重叠对象占用的字节数。

这里 type 是一个术语,并且在[expr]的每个子句中定义了表达式的类型,您可以看到它始终是指静态类型

例如,考虑

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

在此示例中,根据[expr.sizeof] / 1,sizeof(*pb)的结果是*pb的类型。要查看*pb是什么类型,我们转到[expr.unary.op]/1

  

...如果表达式的类型为“指向T的指针”,则结果的类型为“ T”。

然后我们转到[expr.prim.id.unqual]/2

  

结果是由标识符表示的实体。 ...否则,表达式的类型就是结果的类型。

pb表示的实体是指向Base的指针类型的对象,表达式pb也是如此,因此*pb的类型为{{1 }},因此Base的结果就是sizeof(*pb)的大小。