Paragraph 4 of [expr.cast](在撰写本文时提供的C ++标准的最新草案中)描述了C样式强制转换的行为,内容如下:
由
执行的转换可以使用显式类型转换的强制转换符号执行
- 一个
const_cast
,- 一个
static_cast
,- 一个
static_cast
后跟一个const_cast
,- 一个
reinterpret_cast
或- 一个
reinterpret_cast
后跟一个const_cast
,。相同的语义限制和行为适用,除了在以下情况下执行
static_cast
时,即使基类不可访问,转换也是有效的:
- 分别将指向派生类类型的对象或派生类类型的左值或右值的指针显式转换为指向明确基类类型的指针或引用;
- 指向派生类类型的成员的指针可以显式转换为指向明确非虚拟基类类型的成员的指针;
- 指向明确的非虚拟基类类型的对象的指针,明确的非虚拟基类类型的glvalue或指向明确的非虚拟基类类型的成员的指针可以显式转换为指针,引用或指向派生类类型的成员的指针。
如果可以使用以上列出的多种方法来解释转换,则使用列表中第一个出现的解释,即使该解释导致的转换格式不正确。 如果转换可以以多种方式解释为
static_cast
,后跟const_cast
,则该转换格式不正确。 [...]
我的问题是,“ 转换如何以多种方式解释为static_cast
,后跟const_cast
”?
谢谢。
答案 0 :(得分:4)
类似这样的东西:
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*
的类似强制转换成功。 Demo