gpt4 book ai didi

c++ - friend 应该在嵌套类中传递吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:39 24 4
gpt4 key购买 nike

class private_object
{
private:
struct make_public;
friend struct make_public;
static void method1() {}
};

struct private_object::make_public
{
class nested_outer
{
void callFromOuter()
{ private_object::method1(); } // Should this be an error?

class nested_inner
{
void callFromInner()
{ private_object::method1(); } // How about this one?
};
};
};

当我尝试将一个开源项目移植到 borland 下编译时,出现了这个友元问题。根据parashift和两个半相关的问题herehere ,上面的例子应该是无效的。

然而,在七个 不同的编译器1 上对其进行测试后,只有 borland 和 dmc 提示。这种行为让我感到惊讶,因为我没想到友元会在嵌套类中传递。

所以这提出了几个问题:

  • 什么是正确的行为?我猜大多数编译器都接受它。
  • 如果这是正确的行为,为什么这个友元传递实例可以?
  • 如果这是正确的,那么这也意味着标准发生了变化。在标准中允许这样做的原因可能是什么?
  • 对于拒绝此代码的编译器,什么是合适的解决方法?请记住,实际项目可能包含相当深的嵌套,因此我正在寻找一种半可扩展的解决方案。

<子>1。在 mingw-gcc 4.5.2、clang、borland c++ builder2007、digital mars、open watcom、visualc2010 和 comeau online 上测试

最佳答案

在 C++03 中,嵌套类不能默认访问封闭类的privateprotected 成员(参见§11.8/1) .但是如果你让他们成为封闭类的 friend ,那么他们就可以访问它们。但是嵌套类的嵌套类仍然不是最外层封闭类的友元,嵌套类的嵌套类不能访问最外层封闭类的私有(private)成员和保护成员;如前所述,它甚至不能访问直接封闭类的私有(private)和 protected 成员。你正在做的是,因此这是不允许的。

C++ 标准 (2003) 在 $11.8/1 [class.access.nest] 中说,

The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friendship to an enclosing class; the usual access rules (clause 11) shall be obeyed. The members of an enclosing class have no special access to members of a nested class; the usual access rules (clause 11) shall be obeyed.

标准本身的示例:

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

这是 C++03 标准中的缺陷。

顺便说一下,它是 C++03 标准中的一个缺陷。由于嵌套类是一个成员,它应该可以访问私有(private)和 protected 成员,就像任何其他成员一样:

§9.2/1 (C++03):

Members of a class are data members, member functions (9.3), nested types… Nested types are classes (9.1, 9.7) and enumerations (7.2) defined in the class…

查看此缺陷报告:

关于c++ - friend 应该在嵌套类中传递吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419829/

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