7.6.1 Postfix expressions
7.6.1.6 Dynamic cast
Paw5zx个人理解:点击查看更多
待补充
Paw5zx个人理解:点击查看更多
类型相同则不做RTTI检查,结果就是v本身;必要时做qualification conversion,例如添加const等(待验证)
1 | struct B { }; |
Paw5zx个人理解:点击查看更多
对于向上转换,dynamic_cast等价于普通的隐式转换
Paw5zx个人理解:点击查看更多
1 | struct B1 { virtual ~B1() = default; }; |
Paw5zx个人理解(针对8.1):点击查看更多
8.1对应的是指针向下转型(downcast)
以此为例:
1 | struct B { virtual ~B() = default; }; |
①v指向的最派生对象中,指的是包含v指向的这个基类子对象的那个完整体对象,即m
②v指向C对象的一个公有基类子对象,即B的对象
Paw5zx个人理解(针对8.2):点击查看更多
8.2对应的是侧向转型(crosscast),即在从同一个基类派生的两个类型之间进行转换
何时不会命中8.1?
- ①v指向的B对象不是C的公有基类子对象,或;
- ②B对象可以通过多条路径归属到C
1 |
7.6.1.8 Static cast
static_cast运算符不会去除常量性。
类型为”cv1 B”的将亡值,可以被转换为类型”cv2 D的右值引用”,所有限制条件与左值版”cv1 B”的转换(”cv1 B”的左值->”cv2 D的引用”)相同。
若”cv1 B”类型的对象实际上是某个D类型对象的基类子对象,则转换结果将引用该外围的D类型对象(包含这个B子对象的D对象本身)。否则(即B对象不是某个D的基类部分),行为未定义。
【示例:
1 | struct B { }; |
——示例结束】
Paw5zx个人理解:点击查看更多
这里自己总结了一下,但是cppreference中总结的更好一些,因此参考cppreference中的总结:
对于static_cast<target-type>(expression),只能执行下列几种转换,除非这些转换会移除const(或volatile)限定:
1)如果expression是类型”cv1 Base”的左值,target-type是”cv2 Derived的引用”,并且满足以下约束,则结果指向expression所处的Derived类型对象:
- Derived是一个完整类类型
- Base是Derived的基类
- cv2 ≥ cv1
如果满足以下条件,则程序是非法的:
- Base是Derived的直接虚基类
- Base是Derived的一个虚基类的基类
- 不存在从””指向Derived的指针”到”指向Base的指针”的有效标准转换(访问性等因素)
如果expression实际上不是类型为Derived的对象的基类子对象,则行为是未定义的。
一些示例:
1 | void func_virtual() |
若“cv2 T2”与“cv1 T1”引用兼容(reference-compatible),则“cv1 T1”类型的左值可以被转换为“对cv2 T2的右值引用”类型。
若该左值不是位域,则结果引用该对象本身,或其指定的基类子对象;否则(即该左值是位域),将对该位域应用左值到右值转换(lvalue-to-rvalue conversion),并将得到的纯右值用作本小节其余部分的static_cast的表达式。
若T2是T1的不可访问或二义的基类,则需要进行此类转换的程序为非法的(ill-formed)。
Paw5zx个人理解:点击查看更多
否则(即该左值是位域),将对该位域应用左值到右值转换,并将得到的纯右值用作本小节其余部分的static_cast的表达式。
1 | void bitfield_case() |
若T2是T1的不可访问或二义的基类,则需要进行此类转换的程序为非法的(
ill-formed)。
1 | void inaccessible_base_ill_formed() |