c ++类中的defs顺序,令人惊讶

And*_*rei 7 c++

Stroustrup在C++语言书中指出,类中定义的顺序无关紧要.
确实:

class C1 { 
       int foo() { return bar(); }    // where is bar() ?
       int bar() { return m_count; }  // oh, here is bar(). but where is m_count ?
       int m_count;                   // here is m_count. Better late than never !
}
Run Code Online (Sandbox Code Playgroud)

这编译.尽管有错误.按照承诺.到现在为止还挺好.

但是,这不编译:

class C2 {
      void baz(Inner *p) {} // we were promised that order does not matter
                            // is Inner defined ?
      struct Inner {};      // yes, Inner is define here.
};
Run Code Online (Sandbox Code Playgroud)

这看起来与Stroustrup在课堂上自由订购的承诺相矛盾.引用Stroustrup:"在类中声明的成员函数可以引用类的每个成员,就好像在考虑成员函数体之前完全定义了类".

有没有人知道ref允许C1和禁止C2的标准条款?我很好奇为什么在允许C1时不允许使用C2.可能是编译器错误与标准相矛盾吗?

小智 5

请注意,以下编译正常(在VS2008中):

class C2 {
  void baz() {  Inner* i = new Inner(); }
  struct Inner {}; 
};
Run Code Online (Sandbox Code Playgroud)

您的两个示例之间存在两个差异.第一个在函数体内使用未声明的符号,第二个在函数的签名中使用未声明的类型.

我怀疑我的示例和第一个示例都有效,因为在解析完整个类声明之前,函数体不会被解析.功能签名一旦遇到就必须有意义.


n. *_* m. 4

必须在使用前声明表示类型的标识符.这与C++语法的复杂结构有关.如果事先不知道哪些标识符是类型,则编译器根本无法解析某些代码.