形成不良的静态演绎

时间:2014-08-02 14:56:51

标签: c++ static-cast

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

struct A { };
struct I1 : A { };
struct I2 : A { };
struct D : I1, I2 { };
A* foo( D* p ) {
    return (A*)( p ); // ill-formed static_cast interpretation
}

我一直试图理解这个例子,但我无法理解。我根本没有在示例中使用static_cast。它与static_cast有什么关系?一般来说,你会解释错误的重点。

1 个答案:

答案 0 :(得分:3)

“C样式转换”称为“显式类型转换”,如果符合C.11标准,将在§5.4中讨论。在¶4:

  

由。执行的转换    - const_cast(5.2.11),
   - static_cast(5.2.9),
   - static_cast后跟const_cast
   - reinterpret_cast(5.2.10)或
   - reinterpret_cast后跟const_cast
  可以使用显式类型转换的强制转换表示法执行。

基本上说static_cast可能是演员表达的结果。然后它列出了一些有效static_cast的条件,你引用的例子是一个无效的例子。就在那个例子之前是下面的文本(¶4的最后):

  

如果转换可以用上面列出的多种方式解释,则使用列表中首先出现的解释,即使由该解释产生的转换形式不正确也是如此。如果转化可以多种方式解释为static_cast后跟const_cast,则转换格式不正确。

列出的示例格式错误的原因是因为I1I2都是virtual的非A继承。因此,在DI1上使用多重继承的I2将在其中包含两个A个实例,因此尝试将D *强制转换为{ {1}}有不止一种解释。程序员需要指定应该导致哪个A *实例,以避免形成错误的转换。

ASCII艺术提醒:

A *