答案不清楚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。)中才被认为是正确的,但是为什么呢?我认为所有这些都是有效的。甚至测试了所有代码,它们都能成功编译。为什么只有第一个答案是正确的?

量子开发

最初为测试写答案的人是错误的。

  • 该示例(完全)来自C ++标准本身,第11/7节,[class.access],并已由编写“测试”的人复制。

该示例在标准中使用模板进行了进一步扩展(在此将省略它们):

      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的一个成员的返回类型]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章