指针类型类成员的动态强制转换的恒定性是什么?

What is the const-ness of dynamic cast of a pointer-type class member

本文关键字:转换 恒定性 是什么 动态 类型 成员 指针      更新时间:2023-10-16

下面的简单程序无法使用MSVC编译,但不能使用GCC和Clang编译?(即 MSVC 触发static_assert(。

#include <utility>
class Element {
virtual ~Element() = default;
};

struct Proxy {
Element* e{};
};
int main() {
Proxy p;
static_assert(std::is_same<decltype(dynamic_cast<const Element*>(p.e)), const Element*>::value, "not const???" );
}

我认为标准很明确:

表达式 dynamic_cast(v( 的结果是 将表达式 v 转换为类型 T.T 应为指针或 引用完整的类类型,或"指向 cv void 的指针"。这 dynamic_cast操作者不得抛弃恒常性 ([expr.const.cast](。

标准中是否有其他部分支持MSVC,还是编译器错误?甚至是 UB?但如果是这样,为什么呢?

实时代码在这里。

它看起来像一个编译器错误。[expr.dynamic.cast]/3 表示结果应该是指向 const 限定类类型的指针。

如果 v 的类型与 T 相同,或者与 T 相同,只是 T 中的类对象类型比类对象更符合 cv 条件 输入 v,结果为 v(必要时转换(。

我强调"必要时转换",因为它适用于类类型的常量资格,我相信。