gez*_*eza 0 c++ static-typing sizeof language-lawyer c++17
是静态还是动态类型的expr使用sizeof expr?
请引用C++ 17标准.
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.