【问题标题】:Friends confusion朋友困惑
【发布时间】:2010-09-03 02:49:16
【问题描述】:

$11.4/5 - “[...]类中定义的友元函数在定义它的类的(词法)范围内[...]”

这句话是什么意思?

struct A{
   typedef int MYINT;
   void f2(){f();}                    // Error, 'f' is undefined
   friend void f(){MYINT mi = 0;}     // Why does this work, shouldn' it be A::MYINT?
   void f1(){f();}                    // Error, 'f' is undefined
};

int main(){}
  1. 这里令人困惑的是,从“A::f1”调用“f”是可以理解的。但是,当朋友在交友类的“词汇”范围内时,为什么从“A::f2”调用“f”格式不正确? “词法”范围是什么意思?

  2. 在同一类型中,为什么在“f”中使用“MYINT”可以?不应该是'A::MYINT'吗?

如果我将“A *”类型的参数添加到“f”,那么“f1”和“f2”都能够找到“f”,因为 ADL。这是可以理解的。

【问题讨论】:

标签: c++ friend


【解决方案1】:

您仅引用了 §11.4/5 的一部分。根据它 f() 应该首先在类外声明(函数应该具有命名空间范围)。试试这个:

void f(); // declare it first
struct A{
   typedef int MYINT;
   void f2(){f();}                    
   friend void f(){MYINT mi = 0;}     // definition of global f, a friend of A
   void f1(){f();}                    
};

至于第二个问题,没关系,因为您引用了 §11.4/5 的一部分。 f() 遵循与该类的静态成员函数相同的名称绑定规则,并且对封闭类的成员没有特殊的访问权限。

【讨论】:

    【解决方案2】:

    这是我对查询的一部分的解释

    “Why MYINT”可以称为 “MYINT”而不是“A::MYINT”?

    $3.4.1/9 状态 - “名称查找 定义中使用的名称 内联定义的友元函数 (11.4) 在授予友谊的课堂上 按照所述进行查找 成员函数定义。如果 友元函数未在 类授予友谊,名称查找 在友元函数定义中 应按所述进行查找 在命名空间成员函数中 定义。”

    在我们的例子中,要查找的名称是“MYINT”,它是一个非限定名称。在类中内联定义的朋友“f”的定义中查找此名称的方法与查找“A”的成员函数的方法相同。

    我的理解正确吗?

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 2011-08-10
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多