2010-09-03 47 views
6

$ 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' 都能够找到,因为ADL的 'F'。这是可以理解的。

+2

在(词汇)范围内意味着它有权访问包含范围。因此MYINT是有效的。 http://stackoverflow.com/questions/1047454/what-is-lexical-scope,http://stackoverflow.com/questions/991518/c-how-do-i-call-a-friend-template-function-定义-内部-A级 – Anycorn 2010-09-03 03:22:25

回答

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()服从与该类的静态成员函数相同的名称绑定规则,并且对封闭类的成员没有特殊访问权限。

0

这里是我的我的查询的一个部件,它是

的interpreation“为什么MYINT”可以被称为 “MYINT”代替“A :: MYINT”?

$ 3.4.1/9条规定 - “名称查找在一个 友元函数(11.4)的定义中使用一个 名在类授予友谊定义内嵌 应 在 成员函数定义为查找说明操作如果 友元函数不是在 类授予友谊定义,名称查找 在友元函数定义 作为查找 命名空间中的成员函数的定义 描述着手“。

在我们的例子中,要查找的名称是'MYINT',它是一个非限定名称。在该类中内联定义的朋友'f'的定义内查找该名称将与'A'的成员函数完全相同。

我的理解是否正确?