C++ 格式错误的静态cast解释

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),或

我遇到了以下代码(第5.4/4节N3797):

我一直在努力理解这个例子,但我不能。我在示例中根本没有使用过
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
不是虚拟基地。也就是说,这里没有菱形图案。因此,在A
D
中有两个
A
。那么,您希望
A
foo()
的结果是寻址哪个
I1
的源,还是
I2
的源?模糊性是错误的原因。请查看虚拟继承:@WhozCraig钻石图案是什么?@St.Antario没有。这就是重点。如果有一个
A
“共享”的“实例”作为
I1
I2
的基础,那么您就会有一个。(回头看你的评论,我看到你问的是“什么”,而不是“在哪里”。对于这一困惑,我很抱歉。希望链接的答案有帮助(应该)。@WhozCraig什么是静态类型?+1引用。OP应该注意术语“显式类型转换”,它表示
(T)的应用
;在本例中,
T
A*
。如何确定有多少种方法来解释适当的强制转换表达式?转换按上述顺序应用,第一种可以使用的转换是使用的转换,即使格式不正确。格式不正确的原因不是应用了多个转换,而是选择了
A*
不明确。
+---+          +---+
| A |          | A |
+---+          +---+
  |              |
 /_\            /_\
  |              |
+----+         +----+
| I1 |         | I2 |
+----+         +----+
  |              |
  +------.-------+
         |
        /_\
         |
       +---+
       | D |
       +---+