4

考虑这个函数调用:

foo::bar();

11.3.1.1.1,第 3 段 [over.call.func] ( N4778 ) 涵盖了这种情况:

在非限定函数调用中,名称不由->or.运算符限定,并且具有更通用的primary-expression 形式。按照函数调用中名称查找的正常规则,在函数调用的上下文中查找名称...

在这里,foo::bar是一个不合格的名称,因为它没有被->or.限定。所以本段适用。现在,短语“在上下文中查找”的含义在 6.4 第 2 段 [basic.lookup] 中进行了解释:

“在表达式的上下文中查找”的名称在找到表达式的范围内被查找为非限定名称

但是, 是名称查找领域中foo::bar的限定名称。也就是说,这个组合的段落基本上就是说,限定名是按照非限定名查找规则来查找的。但是,我不认为不合格的名称查找能够递归地进入更窄的范围,即to 。这是缺陷吗?foo::barfoobar

4

1 回答 1

1

不,我不认为这是一个缺陷。它说

按照函数调用中名称查找的正常规则,在函数调用的上下文中查找名称[...]

从我突出显示的部分可以看出,该标准指定了应该如何查找名称:按名称查找。

名称查找涉及非限定、限定和依赖参数的查找,因此您的名称确实是由限定名称查找规则解析的。

“在expr的上下文中查找”规则在这里不适用,因为它指定了使用什么规则。那段只有在没有的时候才起作用。例如,在[class.qual]p1中:

在整个后缀表达式出现的上下文中查找模板 ID的模板参数中的名称。

于 2018-10-21T15:02:07.110 回答