C++ 格式错误的静态cast解释
我遇到了以下代码(第5.4/4节N3797): 我一直在努力理解这个例子,但我不能。我在示例中根本没有使用过C++ 格式错误的静态cast解释,c++,static-cast,C++,Static Cast,我遇到了以下代码(第5.4/4节N3797): 我一直在努力理解这个例子,但我不能。我在示例中根本没有使用过static\u cast。它与静态\u cast有什么关系。一般来说,请您解释一下错误的原因。如果C.11标准适用,则“C样式转换”称为“显式类型转换”,并在§5.4中讨论。在第4章: -aconst\u cast(5.2.11), -astatic\u cast(5.2.9), -一个static\u cast后接一个const\u cast, -a重新解释演员表(5.2.10),或
static\u cast
。它与静态\u cast
有什么关系。一般来说,请您解释一下错误的原因。如果C.11标准适用,则“C样式转换”称为“显式类型转换”,并在§5.4中讨论。在第4章:
-a
const\u cast
(5.2.11),-a
static\u cast
(5.2.9),-一个
static\u cast
后接一个const\u cast
,-a
重新解释演员表(5.2.10),或
-一个重新解释cast
后接一个常量cast
,
可以使用显式类型转换的强制转换表示法执行
这基本上是说一个静态\u cast
可能是一个cast表达式的结果。然后,它列出了一些条件,在这些条件下,它是一个有效的静态\u cast
,您引用的示例是一个无效的示例。在该示例之前,有以下文本(第4章末尾):
如果转换可以用以上列出的多种方式进行解释,则使用列表中首先出现的解释,即使该解释产生的转换格式不正确。如果转换可以以多种方式解释为静态转换
后跟常量转换
,则转换格式不正确
所列示例格式不正确的原因是I1
和I2
都从A
进行非虚拟继承。因此,在I1
和I2
上使用多重继承的D
将有两个A
实例,因此尝试将D*
强制转换为A*
有多个解释。程序员需要指定*
实例应产生的实例,以避免格式错误的转换
ASCII艺术警报:
+---+ +---+
| A | | A |
+---+ +---+
| |
/_\ /_\
| |
+----+ +----+
| I1 | | I2 |
+----+ +----+
| |
+------.-------+
|
/_\
|
+---+
| D |
+---+
A
不是虚拟基地。也就是说,这里没有菱形图案。因此,在AD
中有两个A
。那么,您希望A
的foo()
的结果是寻址哪个I1
的源,还是I2
的源?模糊性是错误的原因。请查看虚拟继承:@WhozCraig钻石图案是什么?@St.Antario没有。这就是重点。如果有一个A
“共享”的“实例”作为I1
和I2
的基础,那么您就会有一个。(回头看你的评论,我看到你问的是“什么”,而不是“在哪里”。对于这一困惑,我很抱歉。希望链接的答案有帮助(应该)。@WhozCraig什么是静态类型?+1引用。OP应该注意术语“显式类型转换”,它表示(T)的应用
;在本例中,T
是A*
。如何确定有多少种方法来解释适当的强制转换表达式?转换按上述顺序应用,第一种可以使用的转换是使用的转换,即使格式不正确。格式不正确的原因不是应用了多个转换,而是选择了A*
不明确。
+---+ +---+
| A | | A |
+---+ +---+
| |
/_\ /_\
| |
+----+ +----+
| I1 | | I2 |
+----+ +----+
| |
+------.-------+
|
/_\
|
+---+
| D |
+---+