【发布时间】:2014-05-23 13:52:36
【问题描述】:
考虑以下代码:
#include <stdio.h>
class A
{
public:
friend void foo(A a){ printf("3\n"); }
};
int main()
{
foo(A());
}
它有效。但我认为这段代码是无效的。那是因为3.4.1/3:
为了确定(在解析期间)一个表达式是否是 函数调用的后缀表达式,常用名称查找规则 申请。
通常的名称查找规则无法找到朋友函数,因为在我的情况下,朋友声明的名称在全局命名空间中是不可见的。实际上是 3.3.1/4:
朋友声明 (11.3) 可能会引入(可能不可见)名称 进入封闭的命名空间
这意味着程序格式错误。这是因为在判断过程中没有找到名称,表达式foo(A());是函数调用的后缀表达式。
我很困惑……
【问题讨论】:
-
你在标题中找到了答案。你到底在问什么?
-
我会尽力说明这一点,希望我做对了。如果不让我知道,我会编辑。
-
@juanchopanza 因为 foo 对于通常的名称查找不可见。这意味着 ADL 不适用于 foo(A())。
-
@juanchopanza 据我所知,ADL 策略仅在通常的名称查找后应用。但是通常的名称查找找不到友元函数声明。
-
在类体内定义的友元函数不在封闭类的范围内,它们在文件范围内