关于静态铸造临时继承人的标准是什么?

时间:2011-09-21 14:03:01

标签: c++ inheritance protected standards undefined-behavior

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

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)对这种情况的看法吗?

1 个答案:

答案 0 :(得分:1)

这种类型的操作实际上是实现常量重复发生模板模式的基础,其中在基类内部实际static_cast基类的this指针到派生类模板类型。由于ST的明确基类,并且您无法访问static_cast中尚未成为S成员的任何成员,因此我不明白为什么你会遇到任何问题。

第5段中关于静态铸造的第5.2.8节说明:

  

类型为“ cv1 B”的左值,其中B是类类型,可以强制转换为“引用 cv2 D”,其中D是类来自B的派生(第10条),如果存在从“指向D的指针”到“指向B的指针”的有效标准转换(4.10), cv2 与cv-资格相同,或者更大的cv-资格比, cv1 ,而B不是D的虚拟基类。结果是类型为“ cv2 D”的左值。如果类型为“ cv1 B“实际上是D类型对象的子对象,左值是指类型D的封闭对象。否则,未定义强制转换的结果。

您似乎满足了避免未定义行为的所有要求。那就是:

  1. 班级T源自S
  2. 确实存在从ST的指针转换,因为S都是可访问的,且T的基类是明确的(4.10中的要求)
  3. 您对两种类型使用相同的常量值限定
  4. S不是T
  5. 的虚拟基类