有时(很少)我需要从现有变量中获取受保护的成员 像这样:
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)对这种情况的看法吗?
答案 0 :(得分:1)
这种类型的操作实际上是实现常量重复发生模板模式的基础,其中在基类内部实际static_cast
基类的this
指针到派生类模板类型。由于S
是T
的明确基类,并且您无法访问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的封闭对象。否则,未定义强制转换的结果。
您似乎满足了避免未定义行为的所有要求。那就是:
T
源自S
S
到T
的指针转换,因为S
都是可访问的,且T
的基类是明确的(4.10中的要求)S
不是T