指针类型类成员的动态强制转换的恒定性是什么?
What is the const-ness of dynamic cast of a pointer-type class member
下面的简单程序无法使用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(必要时转换(。
我强调"必要时转换",因为它适用于类类型的常量资格,我相信。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 指针类型类成员的动态强制转换的恒定性是什么?
- 为什么对引用的常量引用会失去其恒定性?
- 运算符的要求<恒定性在标准::stable_sort
- 模板参数推导由于恒定性不一致而失败
- 为什么模板参数失去恒定性?
- 为什么普遍引用不保持其论点的恒定性
- 是否可以使用 SFINAE 检测类方法的恒定性?
- 在模板中强制转换为引用似乎会抛弃恒定性
- 模板转换运算符优先级和恒常性
- 在分配对象时保持恒定性
- 常量成员函数中模板成员的恒定性
- 恒常正确性和shared_ptr转换
- 变量的恒定性及其生存期
- 尊重恒定性,同时避免在堆上重新分配
- C++ 将基数*转换为派生*和恒常性
- const_cast转换为左值引用不会消除恒常性
- 参考类成员的恒定性
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?