gpt4 book ai didi

c++ - C++ 类中定义的友元函数的成员访问控制

转载 作者:行者123 更新时间:2023-12-01 13:07:39 26 4
gpt4 key购买 nike

我了解以下 C++ 代码片段应在 g 的定义中产生错误。 , 因为 p.t.x是私有(private)的,不能在那里访问。

class P {
class T {
int x;
friend class P;
};
T t;

friend void g(P &p);
};

void g(P &p) { p.t.x = 42; }

让我困惑的是下一个片段。不同之处仅在于 定义 friend 功能 g现在发生 里面 类(class) P .
class P {
class T {
int x;
friend class P;
};
T t;

friend void g(P &p) { p.t.x = 42; }
};

Clang++(6.0.0-1ubuntu2 和 Apple 版本 clang-1100.0.33.8)编译后者没有错误,而 GNU C++(7.5.0-3ubuntu1~18.04)产生与前一个片段相同的错误。

我理解函数 g后一种情况下定义的不在同一范围内
正如前者中定义的那样(参见 related questionolder longer discussion ),它只能通过 ADL 看到。但我认为我在这里问的是不同的:声明 friend class P 是否应该?在类里面 T扩展到 friend 函数体 g或不?

C++ 标准的相关部分(最近的 drafts 中的 §11.3 或 §11.9.3 )指出:

7 ... A friend function defined in a class is in the (lexical) scope of the class in which it is defined. A friend function defined outside the class is not (6.5.1).



所以我知道 Clang++ 和 GNU C++ 对“词法范围”的含义有不同的解释(另见 this answer 到前面的相关问题)。 Clang++ 似乎可以编译 g仿佛是类的 friend T ,可能是因为它在类 P 的词法范围内哪个是类的 friend T ,而 GNU C++ 没有。
  • 两个编译器之一中是否存在错误?
  • 如果是,是哪一个?
  • 不管前面问题的答案如何,这不是标准应该更好地形式化的东西吗?
  • 最佳答案

    这看起来像 CWG1699 (仍然开放)。

    1699. Does befriending a class befriend its friends?

    According to 14.3 [class.friend] paragraph 2,

    Declaring a class to be a friend implies that the names of private and protected members from the class granting friendship can be accessed in the base-specifiers and member declarations of the befriended class.



    一个 friend声明是一个成员声明,​​但不清楚在 friend 声明中授予友元的程度。例如:

      class c {
    class n {};
    friend struct s;
    };

    struct s {
    // #1 and #2 are not relevant for this question
    friend void f() { c::n(); } // #3
    };

    特别是,如果在类定义中定义了一个友元函数,如 #3 中那样,它的定义是否可以访问友好类的私有(private)成员和 protected 成员?实现在这一点上有所不同。

    关于c++ - C++ 类中定义的友元函数的成员访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61226041/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com