C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释

C++ cast notation of explicit type conversion (C-style cast) and multiple interpretations of static_cast

本文关键字:static 解释 cast 表示 类型转换 转换 样式 C++      更新时间:2023-10-16

[expr.cast](在撰写本文时可用的C++标准的最新草案中(的第4段描述了C型cast的行为,内容如下:

执行的转换

  • 一个const_­cast
  • 一个static_­cast
  • 一个static_­cast后跟一个const_­cast
  • reinterpret_­cast,或
  • 一个reinterpret_­cast后跟一个const_­cast

可以使用显式类型转换的强制转换表示法来执行。相同的语义限制和行为也适用,不同之处在于,在以下情况下执行static_­cast时,即使基类不可访问,转换也是有效的:

指向派生类类型的对象的指针或派生类类型的左值或
  • 右值可以分别显式转换为指向明确基类类型的指针或引用;
  • 指向派生类类型成员的指针
  • 可以显式转换为指向明确非虚拟基类类型成员的指针;
  • 指向明确非虚拟基类
  • 类型的对象的指针、明确非虚拟基类类型的 GL值或指向明确非虚拟基类类型成员的指针可以分别显式转换为指针、引用或指向派生类类型成员的指针。

如果可以通过上面列出的多种方式解释转换,则使用列表中首先出现的解释,即使由该解释产生的转换格式不正确也是如此。如果一个转换可以用多种方式解释为一个static_­cast后跟一个const_­cast,则转换是格式错误的。[...]

我的问题是,如何">以多种方式将皈依解释为static_cast后跟const_cast"?

谢谢。

像这样:

struct S {
operator int const**() { return nullptr; }
operator int *const*() { return nullptr; }
};
S s;
(int**)s;  // error: cannot cast from type 'S' to pointer type 'int **'

int const**int *const*相似的演员阵容成功了。演示