![]() |
1
26
对于允许此类铸造的类型(例如,如果
另一方面,
更具体地说,我只会引用标准的相关部分,重点强调以下重要部分: 5.2.10【expr.reinterpret.cast】:
所以像这样:
实际上未指明。
解释原因
再一次,让我引用标准的章节,这些章节共同引导我得出结论,上述内容应该是可移植的: 3.9[基本类型]:
3.9.2【碱性化合物】:
3.10[基本等级]:
4.10〔VAN.PTR〕:
5.2.9【膨胀静态铸造】:
[编辑] 另一方面,我们有这个宝石: 9.2[等级mem]/17:
这似乎意味着
|
![]() |
2
6
毫无疑问,这两种形式都有很好的定义,但措辞并没有抓住这一点。 这两种形式都将在实践中发挥作用。
|
![]() |
3
3
之所以如此,是因为C++如何定义继承,以及因为成员指针。 对于C,指针基本上只是一个地址,它应该是。在C++中,由于它的一些特性,它必须更复杂。 成员指针实际上是类中的偏移量,因此使用C样式强制转换它们总是一个灾难。 如果您已经多次继承了两个也有一些具体部分的虚拟对象,这对于C样式来说也是一个灾难。但是,在多重继承中,这种情况会导致所有的问题,所以无论如何您都不应该使用它。 真的希望你一开始就不要使用这些案例。另外,如果你投了很多,这是另一个迹象,你在你的设计混乱。 我最后一次铸造是用C++中的原语决定的是不一样的,但是显然它们必须是。对于实际的对象,任何时候你想要投射一些东西,就开始质疑你的设计,因为大多数时候你应该“编程到接口”。当然,您不能更改第三方API的工作方式,因此您没有太多的选择。 |