【发布时间】:2021-07-07 21:05:40
【问题描述】:
我已阅读 [basic.lookup.unqual] 的标准部分,对此我感到困惑:
typedef int f;
namespace N {
struct A {
friend void f(A &);
operator int();
void g(A a) {
int i = f(a); // f is the typedef, not the friend function: equivalent to int(a)
}
};
}
请考虑上面的代码;我不明白为什么名称f 是类型int,而不是void f(A &)。在我的理解中,名称查找应该首先在类作用域 A 中找到 void f(A &)。如果在那里找不到名称,它将在外部命名空间中执行查找。显然,A 类中有一个名称 void f(A &),正如标准所说:
一旦找到名称的声明,名称查找就会结束
那么,如果还有其他特殊规则,为什么名称在这里引用int 类型?
【问题讨论】:
-
@bolov 我期待阅读您描述性很强的答案。
-
@JerryJeremiah 名称查找与表达式中初始化程序的类型无关,这是其他规则,查找只保证找出这些声明
标签: c++ c++17 language-lawyer friend name-lookup