答案并不清楚c ++

时间:2014-07-16 01:37:27

标签: c++

这是一个测试问题:

请考虑以下代码:

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

以下哪项有效:

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;

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

2 个答案:

答案 0 :(得分: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;
  • 引用解释标准:
  

此处A::I的所有用途都是格式正确的,因为A::fA::x是   A类和G类的成员是A类的朋友。这意味着,因为   例如,首次使用A::I时的访问检查必须是   推迟到确定A::I的使用为止   A类成员的类型。]

答案 1 :(得分:4)

它们都是有效的C ++。

这是确切的代码,它是标准本身的一个例子:

http://www.open-std.org/jtc1/sc22/open/n2356/access.html

这是我解析它们的方式:

a. A::I A::f() { return 0; } // defines A::f() which was previously prototyped

b. A::I g(A::I p = A::x);    // declares prototype g(A::I), but doesn't define it

c. A::I g(A::I p) { return 0; } // defines g(A::I)

d. A::I A::x = 0; // defines static storage for A::x which was previously declared in A

这些都是单独和集体编译的。