答案并不清楚c ++

Nar*_*rek 25 c++

这是一个测试问题:

请考虑以下代码:

class A {
    typedef int I; // private member
    I f();
    friend I g(I);
    static I x;
};
Run Code Online (Sandbox Code Playgroud)

以下哪项有效:

a. A::I A::f() { return 0; }
b. A::I g(A::I p = A::x);
c. A::I g(A::I p) { return 0; }
d. A::I A::x = 0;
Run Code Online (Sandbox Code Playgroud)

这个问题的答案只被认为是正确的第一个版本(a.),但为什么?在我看来,它们都是有效的.甚至测试了所有他们成功编译.为什么只有第一个答案是正确的?

qua*_*dev 27

谁写了测试的原始答案是错误的.

  • 这个例子(确切地)来自C++标准本身,第11/7节,[class.access],并且被写了"test"的人复制了.

该示例在标准中更进一步,使用模板(我将在此省略它们):

      class A {
          typedef int I;      // private member
          I f();
          friend I g(I);
          static I x;
      };

      A::I A::f() { return 0; }
      A::I g(A::I p = A::x);
      A::I g(A::I p) { return 0; }
      A::I A::x = 0;
Run Code Online (Sandbox Code Playgroud)
  • 引用解释标准:

在这里,所有的用法A::I都是格式良好的,因为A::f并且 A::x 是A类的成员,g是A类的朋友.这意味着,例如,A::I 必须推迟对第一次使用的访问检查, 直到确定这个用途为止. of A::I作为A类成员的返回类型.]