【问题标题】:Private enum access fails to compile from a nested class's friend function私有枚举访问无法从嵌套类的友元函数编译
【发布时间】:2019-10-16 13:30:10
【问题描述】:

我目前正在移植一个迄今为止仅使用 Clang 构建的项目,也可以与 GCC 一起使用。该项目包含类似于下面的代码,并且可以使用 Clang 正常编译,但是 GCC 会给出错误消息。

class Outer
{
  enum
  {
      ONE, TWO, THREE, COUNT
  };
public:
  class Inner
  {
    friend class Outer;
    friend void somefunc()
    {
      int x = Outer::COUNT;
    }
  };
};

错误是:

<source>: In function 'void somefunc()':

<source>:15:32: error: 'Outer::<unnamed enum> Outer::COUNT' is private within this context

   15 |                 int x = Outer::COUNT;

      |                                ^~~~~

<source>:6:26: note: declared private here

    6 |         ONE, TWO, THREE, COUNT

      |                          ^~~~~

注意somefunc 签名中的朋友关键字。删除它可以使代码用 GCC 编译得很好,我想知道哪个编译器是正确的?我的印象是友元函数与成员函数具有相同的访问权限,这将使其成为 GCC 错误。

天箭链接:https://godbolt.org/z/OAR0gc

【问题讨论】:

  • 我认为主要问题是一旦你将somefunc 设为好友函数,它将失去对包含类的私有成员的自动访问权限。要么删除 friend 关键字,要么使 sumefunc 也成为 Outer 类的朋友。 (这样它就可以访问它的枚举。)
  • @Gyebro 我明白了,所以你会说 GCC 是正确的,而 Clang 表现出不正确的行为?
  • @nitronoid 我认为 GCC 是正确的,因为友元函数的内联声明仍然被认为是在类范围之外。 Inline friend definitions。如果somefuncOuter 的朋友,它会按预期工作:godbolt.org/z/3AkKUP
  • 我说这是一个 GCC 错误。如果Inner 可以访问Outer 的私有成员,并且函数被命名为Inner 的朋友,则访问控制应该可传递地工作。
  • @0x499602D2 这是我最初的感觉。

标签: c++ language-lawyer inner-classes friend access-control


【解决方案1】:
friend class Outer;

1。不需要,嵌套类可以访问包含类的私有成员。

friend void somefunc()

2。根据https://en.cppreference.com/w/cpp/language/friend第2点,函数“Inner”成员和朋友无法从第1点获得特权。删除朋友关键字。

【讨论】:

  • 请注意,这个问题被标记为language-lawyer,所以答案应该用 C++ 标准的引号来支持。
  • 1) 对于这个最小示例可能不需要,但它仍然有效,并且不会影响产生的错误。 2)是的,正如我在问题中所说,删除friend关键字可以消除错误,您似乎暗示Clang不正确?
  • 根据en.cppreference.com/w/cpp/language/friend第2点你不应该定义会员朋友。
  • @MateuszWojtczak 我认为第 2 点说的是,当用朋友关键字标记时,该函数不是成员。它并没有说你“不应该”这样做,而且我也不想定义一个成员函数。
  • @nitronoid 如果你想访问 Outer 的私人成员,你不应该这样做。另外,如果您不尝试定义成员,为什么您希望它可以访问 Outer 的私有成员?
猜你喜欢
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2012-01-17
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多