显式类型转换的C ++转换符号(C样式转换)和static_cast的多种解释

时间:2018-09-29 19:27:17

标签: c++ casting language-lawyer

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 ”?

谢谢。

1 个答案:

答案 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