混合类和结构

Fle*_*exo 17 c++ struct class undefined-behavior

我很清楚类和结构之间区别,但是我很难权威地说这是否定义得很好:

// declare foo (struct)
struct foo;

// define foo (class)
class foo {
};

// instance of foo, claiming to be a struct again! Well defined?
struct foo bar;

// mixing class and struct like this upsets at least one compiler (names are mangled differently)
const foo& test() {
   return bar;
}

int main() {
   test();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果这是未定义的行为,有人可以指向权威(即ISO的章节和经文)参考的方向吗?

处理这个问题的编译器(Carbide 2.7)相对较旧,我尝试过的所有其他编译器对此都非常满意,但显然没有任何证据.

我的直觉是这应该是未定义的行为,但我找不到任何证实这一点,我很惊讶没有GCC版本或Comeau这么多警告它.

Jer*_*fin 11

它看起来像是它定义的行为.特别是,§9.1/ 2说:

单独class-key identifier ;包含的声明是对当前作用域中名称的重新声明或作为类名称的标识符的前向声明.它将类名引入当前范围.

该标准区分使用之间class,structunion定义一个类,但在这里,谈论的声明,没有这样的区分是由-使用一个class-key等同于其他任何.

  • @awoodland +1,这与我在标准中找到的报价相同.如果您阅读同一段落中的前一句,我的解释是可以使用`struct`或`class`中的任何一个,无论声明中使用了哪个`struct`或`class`:*`enum`关键字用于引用枚举,`union`关键字应用于引用一个联合,并且在整段的上下文中看到`class`或`struct` ...*,我倾向于思考它们是可以互换的. (4认同)
  • FWIW,Herb Sutter(ISO委员会成员)明确表示这是有效的 - 请参阅第154页的勘误表http://www.gotw.ca/publications/xc++-errata.htm - 事实上早期依赖它打印Exceptional C++.前向声明可以使用class,struct,union中的任何一个,并且类型语义是从完整的类型定义派生的.微软这样做的事实并不能真正反映标准所说的内容. (4认同)
  • @埃里克·米克尔森:我不同意。它专门说“名字”,清楚地指出了所指的名字。“ class-key”(OTOH)被专门定义为表示“ class”,“ struct”或“ union”中的任何一种,这里没有任何限制将其限制为三个。 (2认同)
  • @eric§7.1.6.3/ 3(详细说明的类型说明符,我见过的最新的C++ 0x doc)说"要么使用类,要么使用struct class-key来引用使用该类声明的类(第9条)或struct class-key." 这可以通过我认为的方式阅读.无论如何,只需要用一个词来澄清那句话的含义...... (2认同)

Bo *_*son 5

从技术上讲,根据语言标准,代码是可以的。但是,由于至少一个最受欢迎的编译器对此发出了警告,因此在实践中不起作用。

“在理论上,理论与实践之间没有区别。在实践中,没有区别。”