【问题标题】:Static or dynamic type is used for "sizeof expr"?静态或动态类型用于“sizeof expr”?
【发布时间】:2018-08-06 09:50:52
【问题描述】:

expr 是静态类型还是动态类型sizeof expr

请引用 C++17 标准。

【问题讨论】:

  • 提示:结果是否可用作常量表达式?
  • 您能否显示一个expr,您不确定要使用哪种类型?
  • Heresizeof 上的 C++ 标准(嗯,一个工作草案)。
  • @geza “您通过思考编译器如何实现此功能来推断此信息。”是的,这就是 C++ 标准在很大程度上是如何运作的。例如,它没有这样说,例如std::set 将被实现为搜索树或将每个元素存储在单独的分配中,但由于其操作的复杂性和接口要求,这是不可避免的。

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


【解决方案1】:

请参阅sizeof 的参考资料。

具体来说:

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

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

操作数要么是一个表达式,它是一个未计算的操作数(第 8 条),要么是一个带括号的 type-id

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

【讨论】:

    【解决方案2】:

    [expr.sizeof]/1

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

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

    例如,考虑

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

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

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

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

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

    pb表示的实体是指向Base的指针类型的对象,表达式pb也是,所以*pb的类型是Base,因此是sizeof(*pb)的结果是Base 的大小。

    【讨论】:

    • 请注意,这些引用来自 C++20 草案;第一个文本没有出现在任何已发布的标准中。
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2012-07-11
    • 2011-10-29
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多