代码之家  ›  专栏  ›  技术社区  ›  geza

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

  •  0
  • geza  · 技术社区  · 7 年前

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

    请引用C++ 17标准。

    2 回复  |  直到 7 年前
        1
  •  5
  •   xskxzr    7 年前

    [expr.sizeof]/1

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

    在这里 类型 是一个术语,表达式的类型 在每个子条款中定义 ,并且您可以看到它总是引用静态类型。

    例如,考虑

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

    在本例中,结果是 sizeof(*pb) *pb 根据[expr.sizeof]/1。看看是什么类型的 *铅 ,我们转向 [expr.unary.op]/1 :

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

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

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

    pb 是指针类型的对象 Base ,表达式也是 ,所以 *铅 底座 ,因此 尺寸(*pb) 是的大小 底座 .

        2
  •  6
  •   Sander De Dycker    7 年前

    参考文献 sizeof .

    明确地:

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

    这是C++标准下面引用的一个更可读的版本( [表达式大小] ) :

    操作数可以是表达式(未赋值操作数)(第8条),也可以是带圆括号的 类型id .

    申请结果 尺寸 基类子对象的大小是基类类型的大小。

    推荐文章