什么是带扩展和不带扩展的强制转换

LiD*_*ute 2 c++ types casting

我读过显式类型转换(我的重点):

当遇到C 风格的强制转换表达式时,编译器会尝试将其解释为以下强制转换表达式(按以下顺序):

  1. const_cast<target-type>(expression);
  2. static_cast<target-type>(expression)带有扩展:即使基类不可访问(即,此转换忽略私有继承说明符),也允许将派生类的指针或引用强制转换为明确基类的指针或引用(反之亦然)。这同样适用于将指向成员的指针转换为指向明确非虚拟基的成员的指针;
  3. static_cast带有扩展名)后跟const_cast;
  4. reinterpret_cast<target-type>(expression);
  5. reinterpret_cast其次是const_cast

第 2 项和第 3 项中的“带扩展名”是什么意思?如果可能的话,我想要一个带扩展名和不带扩展名(如果有)的转换示例。

o_o*_*tle 5

它只是意味着扩展其功能static_cast

另外,即使基类不可访问(即,此转换忽略私有继承说明符),也允许将派生类的指针或引用强制转换为明确基类的指针或引用(反之亦然)。这同样适用于将指向成员的指针转换为指向明确非虚拟基的成员的指针;

例如:

class A {};

class B : private A {};
Run Code Online (Sandbox Code Playgroud)

你不能这样做:

B b;
A* a = static_cast<A*>(&b); // It's not allowed to convert to inaccessible base class A.
Run Code Online (Sandbox Code Playgroud)

但是你可以:

A* a = (A*)(&b);
Run Code Online (Sandbox Code Playgroud)