C++;显式类型转换(C样式转换)的转换符号和静态转换的多重解释 (在编写时可用的C++标准草案的最新草案)中描述了C风格的演员的行为如下:
由执行的转换C++;显式类型转换(C样式转换)的转换符号和静态转换的多重解释 (在编写时可用的C++标准草案的最新草案)中描述了C风格的演员的行为如下:,c++,casting,language-lawyer,C++,Casting,Language Lawyer,由执行的转换 a常数 a静态广播 一个静态广播后接一个常量广播 a重新解释,或 一个重新解释后接一个常量 可以使用显式类型转换的强制转换表示法执行。同样的语义限制和行为也适用,但在以下情况下执行静态广播时,即使基类不可访问,转换也是有效的: 指向派生类类型的对象或派生类类型的左值或右值的指针可分别显式转换为指向明确基类类型的指针或引用 指向派生类类型的成员的指针可以显式转换为指向明确的非虚拟基类类型的成员的指针 指向明确非虚拟基类类型的对象的指针、明确非虚拟基类类型的glvalue或明确非
- a
常数
- a
静态广播
- 一个
后接一个静态广播
常量广播
- a
,或重新解释
- 一个
后接一个重新解释
常量
静态广播时,即使基类不可访问,转换也是有效的:
- 指向派生类类型的对象或派生类类型的左值或右值的指针可分别显式转换为指向明确基类类型的指针或引用李>
- 指向派生类类型的成员的指针可以显式转换为指向明确的非虚拟基类类型的成员的指针李>
- 指向明确非虚拟基类类型的对象的指针、明确非虚拟基类类型的glvalue或明确非虚拟基类类型的成员的指针可以分别显式转换为指向派生类类型的成员的指针、引用或指针
如果转换可以用以上列出的多种方式进行解释,则使用列表中首先出现的解释,即使该解释产生的转换格式不正确如果转换可以以多种方式解释为静态广播
,然后是常量广播
,则转换格式不正确。[……]
我的问题是“转换如何以多种方式解释为静态转换
,然后是常量转换
”
谢谢。类似这样的内容:
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*
的强制转换成功 好的,但第一句说:“[…]使用列表中第一个出现的解释,即使该解释产生的转换格式不正确”。使用static_cast转换到模棱两可的基类是格式错误的,因此不再需要突出显示的句子。此外,突出显示的句子还特别指出了一个更具体的情况:“一个静态的常量后接一个常量”。类似这样的情况:一个类有两个用户定义的转换运算符,一个是toint const**
,另一个是toint*const*
。C风格的演员阵容是int**
谢谢!这对于reinterpret\u cast
后接const\u cast
不是问题,因为reinterpret\u cast
可以直接强制转换到与目标类型类似(或相同)的类型,但至少是作为源类型限定的cv,然后让const\u cast
丢弃常量,对吗?因此,“中间”类型不能有多个选项。reinterpret\u cast
不使用转换运算符。首先,它不能从非指针转换为指针。当需要执行reinterpret\u cast
后再执行const\u cast
时,这是因为目标类型比源类型“更不符合cv条件”(否则将选择reinterpret\u cast
,因为它在列表中的位置更高)。因此,reinterpret\u cast
用于转换为与目标类型类似的类型,但至少与源类型“as cv qualified”相同。这是因为,正如您所说,reinterpret\u cast不关心源类型是否隐式或显式转换为目标类型。然后,const_cast用于丢弃constness。然而,如果我们有类似于(int**)v的东西,其中v的类型是,例如,(const X**),那么C风格的cast可以解释为const_cast(reinterpret_cast(v))(也就是说,reinterpret_cast可以添加更多的constanness)。但这种选择没有明显的副作用,不像在您的示例中在两个转换运算符之间进行选择一样。@IgorTandetnik“它首先不能从非指针转换为指针”您当然是指从类对象转换为指针。