标准对临时继承者的静态强制转换有什么规定
what standard says about static casting to temporary inheritor?
有时(很少)我需要从现有变量中获取受保护的成员这样的:
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
指向派生类模板类型。由于S
是T
的一个明确的基类,并且您没有访问static_cast
中已经不是S
成员的任何成员,我不明白为什么您会遇到任何问题。
第5.2.8节关于静态强制转换的第5段规定:
类型为"cv1 B"的左值,其中B是类类型,可以强制转换为类型为"对cv2 D的引用",其中D是从B派生的类(第10条),如果存在从"指向D的指针"到"指向B的指针"的有效标准转换(4.10),则cv2与cv1相同或大于cv - qualified。如果"cv1 B"类型的左值实际上是D类型对象的子对象,则该左值指向D类型的封闭对象。否则,强制转换的结果是未定义的。
你似乎满足了避免未定义行为的所有要求。即:
-
T
类衍生自S
- 从
S
到T
的指针转换确实存在,因为S
既可访问,又具有T
的明确基类(4.10的要求) - 对两种类型使用相同的常量值限定
-
S
不是T
的虚基类
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 从长整整转换为uint64_t的推荐方法是什么?
- C++:Lambda 函数指针转换的用例是什么?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 将QGyroscopeReading转换为QVector3D的正确方法是什么?
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 在从 C++ 转换为 C# 的代码中,我应该使用什么而不是 memcpy?
- 在C++中将uint64_t转换为void类型的目的是什么
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 这个typedef和转换运算符语法是什么意思
- 是什么将程序集转换为实际可执行的材料
- 转换为非标量误差是什么意思?我该如何解决?
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?