【问题标题】:Inner class access to private members of outer, according to ISO 2003根据 ISO 2003,内部类访问外部的私有成员
【发布时间】:2015-07-12 09:56:58
【问题描述】:

如 ISO C++ 2003 中所述

§11.8 嵌套类 [class.access.nest]

嵌套类的成员对 封闭类,也不是已授予的类或函数 与封闭班级的友谊;通常的访问规则(第 11 条) 应服从。封闭类的成员没有特殊的 访问嵌套类的成员;通常的访问规则(条款 11) 应遵守。

[示例:

class E {
    int x;

    class B { };

    class I {
        B b; // error: E::B is private ERROR 1
        int y;
        void f(E* p, int i)
        {
            p->x = i; // error: E::x is private ERROR 2
        }
    };

    int g(I* p)
    {
        //return p->y; // error: I::y is private ERROR 3
    }
};

int main()
{}

——结束示例]

所以我认为clangg++ 是错误的,因为他们成功编译了这段代码。

还是我理解错了?

【问题讨论】:

标签: c++ language-lawyer nested-class c++03


【解决方案1】:

这种行为自 2003 年以来发生了变化。工作草案 N4926 (C++17) 中的相关条款现在改为:

§11.7 嵌套类 [class.access.nest]

嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。的成员 封闭类对嵌套类的成员没有特殊的访问权限;通常的访问规则(第 11 条) 必须服从。

所以访问是一种方式:嵌套的类成员可以访问封闭的类成员,反之则不行。

例如:

class Enclosing
{
  int n;
  class Nested
  {
    int n;
    int f (Enclosing& E)
    {
      return E.n; // OK
    }
  } ;
  int f (Nested& N)
  {
    return N.n; // Error: Nested::n is private
  }
} ;

【讨论】:

  • 反之亦然,它们的访问权限是相同的。
  • @VladislavYaroslavlev:在 C++17 中他们没有。
  • 究竟是什么禁止访问?规则说:“没有特殊访问权限”,而不是“没有访问权限”。任何私人成员都可以看到任何其他私人成员。该子句 (11.7) 已经在 C++11 中,而不是在 C++17 中。
  • @VladislavYaroslavlev:禁止使用“应遵守通常的访问规则”这一短语。我在答案中添加了一个示例。尝试启用 C++14 或 C++17。
【解决方案2】:

标准说“没有特殊访问权”,但没有说“根本没有没有访问权”。嵌套类与任何其他成员一样是外部类的成员。

C++03标准中没有明确说明,但C++11明确包含:

11.7 嵌套类 [class.access.nest]

1 嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2011-08-11
    相关资源
    最近更新 更多