标准对临时继承者的静态强制转换有什么规定

what standard says about static casting to temporary inheritor?

本文关键字:转换 什么 静态 继承者 标准      更新时间:2023-10-16

有时(很少)我需要从现有变量中获取受保护的成员这样的:

struct S {
protected:
 int i;
};
struct T : S {
 using S::i;
};
int main() {
 S s;
 static_cast<T&>(s).i = 0;
}

我几乎可以肯定这个(static_cast(s))是UB,但是有人知道c++标准(2003)对这种情况的说法吗?

这种类型的操作实际上是实现常量重复模板模式的基础,在基类中,您实际上将基类的this指针static_cast指向派生类模板类型。由于ST的一个明确的基类,并且您没有访问static_cast中已经不是S成员的任何成员,我不明白为什么您会遇到任何问题。

第5.2.8节关于静态强制转换的第5段规定:

类型为"cv1 B"的左值,其中B是类类型,可以强制转换为类型为"对cv2 D的引用",其中D是从B派生的类(第10条),如果存在从"指向D的指针"到"指向B的指针"的有效标准转换(4.10),则cv2cv1相同或大于cv - qualified。如果"cv1 B"类型的左值实际上是D类型对象的子对象,则该左值指向D类型的封闭对象。否则,强制转换的结果是未定义的。

你似乎满足了避免未定义行为的所有要求。即:

  1. T类衍生自S
  2. ST的指针转换确实存在,因为S既可访问,又具有T的明确基类(4.10的要求)
  3. 对两种类型使用相同的常量值限定
  4. S不是T的虚基类