如果编译器可以在编译时推断出动态类型,那么对象的静态类型是否与动态类型一致?

问题描述 投票:0回答:1

[defns.dynamic.type] 读取

⟨glvalue⟩ 泛左值所引用的最派生对象的类型

从中我了解到

struct B {};
struct D : B {};
std::unique_ptr<B const> d = std::make_unique<D const>();

D const
*d
的动态类型,即使它恰好在编译时已知。

来自 [defns.static.type] 我读到了(我的重点)

表达式的类型 在不考虑执行语义的情况下对程序进行分析得出的结果

是否意味着

*d
static类型也是
D const
,而不是
B const

毕竟编译器可以(而且经常)进行分析,得出结论

*d
确实是
D const
,而不是
B const

c++ pointers language-lawyer dynamictype run-time-polymorphism
1个回答
0
投票

所示声明后

  • 表达式 *d

    static
    类型是
    B const
    ;它的值类别是左值。

  • 泛左值表达式*d引用的对象的

    dynamic
    类型是
    D const

编译器可以确定动态类型是派生类,并且可以省略虚拟分派。但这是知识通过分析程序通过考虑执行语义而产生的知识,这与帖子中引用的内容完全相反。

© www.soinside.com 2019 - 2024. All rights reserved.