expr
使用的是静态类型还是动态类型的sizeof expr
?
请引用C ++ 17标准。
答案 0 :(得分:6)
请参考sizeof
的参考。
特别是:
应用于表达式时,
sizeof
不会对表达式求值,即使表达式指定了多态对象,结果也就是表达式的静态类型的大小。
这是C ++标准( [expr.sizeof] )中以下引号的更易读的版本:
操作数可以是一个表达式,它是一个未求值的操作数(第8条),也可以是带括号的 type-id 。
将
sizeof
应用于基类子对象的结果是基类类型的大小。
答案 1 :(得分:5)
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)
的大小。