考虑此函数调用:
foo::bar();
11.3.1.1.1,第3段[over.call.func](N4778)涵盖了这种情况:
在不合格的函数调用中,该名称不受
->
或.
运算符的限制,并且具有更通用的 primary-expression 形式。 在函数调用的上下文中查找名称,遵循在函数调用中查找名称的常规规则...
此处,foo::bar
是一个不合格的名称,在某种意义上说,它不受->
或.
的限制。因此,本款适用。现在,在6.4第2段[basic.lookup]中解释了短语“在...的上下文中查找”的含义:
在查找表达式的范围内,将“在表达式的上下文中查找的”名称作为不合格的名称进行查找。
但是,foo::bar
是名称查找范围内的限定名称 。换句话说,这些段落的组合基本上说,合格名称foo::bar
是通过不合格名称查找的规则查找的。但是,我认为不合格的名称查找不能递归地进入较窄的范围,即foo
至bar
。这是缺陷吗?
答案 0 :(得分:1)
不,我认为这不是缺陷。它说
在函数调用的上下文中查找名称。遵循在函数调用中查找名称的常规规则 [...]
从我突出显示的部分可以看到,该标准指定了应如何查找名称:通过名称查找。
名称查找涉及非限定,限定和参数相关的查找,因此您的名称确实由限定名称查找规则解析。
“在 expr 上下文中查找”规则不适用于此处,因为它指定了使用的规则。该段仅在不起作用时起作用。例如,在[class.qual]p1中:
在整个 postfix-expression 发生的上下文中查找template-id 的 template-argument 中的名称