⟨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
。
所示声明后
表达式 *d
的
static类型是
B const
;它的值类别是左值。
泛左值表达式*d
引用的对象的
dynamic类型是
D const
。
编译器可以确定动态类型是派生类,并且可以省略虚拟分派。但这是知识通过分析程序通过考虑执行语义而产生的知识,这与帖子中引用的内容完全相反。