限定名称的重载解析

时间:2018-10-19 09:41:45

标签: c++ language-lawyer name-lookup qualified-name unqualified-name

考虑此函数调用:

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是通过不合格名称查找的规则查找的。但是,我认为不合格的名称查找不能递归地进入较窄的范围,即foobar。这是缺陷吗?

1 个答案:

答案 0 :(得分:1)

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

  

在函数调用的上下文中查找名称。遵循在函数调用中查找名称的常规规则 [...]

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

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

“在 expr 上下文中查找”规则不适用于此处,因为它指定了使用的规则。该段仅在不起作用时起作用。例如,在[class.qual]p1中:

  在整个 postfix-expression 发生的上下文中查找

template-id template-argument 中的名称