静态或动态类型用于"sizeof expr"?

gez*_*eza 0 c++ static-typing sizeof language-lawyer c++17

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

请引用C++ 17标准.

San*_*ker 6

请参阅参考资料sizeof.

特别是:

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

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

操作数是表达式,它是未评估的操作数(第8条)或带括号的type-id.

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


xsk*_*xzr 5

[expr.sizeof]/1

sizeof运算符产生其操作数类型的非潜在重叠对象占用的字节.

这里的类型是一个术语,表达式的类型 [expr]的每个子条款定义,你可以看到它总是引用静态类型.

例如,考虑一下

struct Base {};
struct Derived : Base {};
Base *pb = new Derived;
auto s = sizeof(*pb);
Run Code Online (Sandbox Code Playgroud)

在此示例中,结果sizeof(*pb)*pb[expr.sizeof]/1的类型.要查看其类型*pb,我们转向[expr.unary.op]/1:

...如果表达式的类型是"指向T的指针",则结果的类型为"T".

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

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

表示的实体pb是指向类型的对象,Base表达式也是如此pb,因此类型为*pbis Base,因此结果sizeof(*pb)的大小为Base.