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

What is a cast with extensions and without extensions

提问人:LiDa Cute 提问时间:8/26/2023 最后编辑:Toby SpeightLiDa Cute 更新时间:8/26/2023 访问量:56

问:

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

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

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

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

C++ 类型 转换

评论


答:

5赞 o_oTurtle 8/26/2023 #1

它只是意味着扩展它所说的功能:static_cast

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

例如:

class A {};

class B : private A {};

您不能这样做:

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

但您可以:

A* a = (A*)(&b);

评论

1赞 LiDa Cute 8/26/2023
我想我知道了。感谢您的帮助o_oTurtle