$ 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(){}
这里令人困惑的是,从'A :: f1'调用'f'是可以理解的。然而,当一个朋友处于好友阶层的“词汇”范围时,为什么从'A :: f2'调用'f'是不正确的? “词汇”范围意味着什么?
在同一类型中,为什么在'f'中使用'MYINT'可以?不应该是'A :: MYINT'吗?
如果我将'A *'类型的参数添加到'f',那么'f1'和'f2'都能够因为ADL而找到'f'。这是可以理解的。
答案 0 :(得分: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()
遵循与名称绑定相同的规则作为该类的静态成员函数,并且对封闭类的成员没有特殊的访问权限。
答案 1 :(得分:0)
这是我对查询的一部分的解释
“为什么MYINT”可以称为 “MYINT”而不是“A :: MYINT”?
$ 3.4.1 / 9状态 - “查找名称 a的定义中使用的名称 友元函数(11.4)内联定义 在授予友谊的阶级中 按照查找中所述进行操作 成员函数定义。如果 朋友功能没有在中定义 授予友谊,姓名查找的类 在友元函数定义中 应按照查询的描述进行 在命名空间成员函数中 定义“。
在我们的例子中,要查找的名称是'MYINT',这是一个不合格的名称。在类中内联定义的朋友'f'的定义中查找此名称将与'A'的成员函数相同。
我的理解是否正确?