C++ 限定名称的重载解析
考虑此函数调用:C++ 限定名称的重载解析,c++,language-lawyer,name-lookup,qualified-name,unqualified-name,C++,Language Lawyer,Name Lookup,Qualified Name,Unqualified Name,考虑此函数调用: foo::bar(); 11.3.1.1.1第3段[调用函数]()涵盖了这种情况: 在非限定函数调用中,名称不是由->或运算符限定的,它具有更一般的主表达式形式在函数调用的上下文中查找名称遵循函数调用中名称查找的常规规则 在这里,foo::bar是一个非限定名称,的意思是它不是由->或限定的。因此,本段适用。现在,短语“在上下文中查找”的含义在6.4第2段[基本查找]中解释: 名称“在表达式上下文中查找”在找到表达式的范围内作为非限定名称进行查找 但是,foo::bar是名称
foo::bar();
11.3.1.1.1第3段[调用函数]()涵盖了这种情况:
在非限定函数调用中,名称不是由->
或
运算符限定的,它具有更一般的主表达式形式在函数调用的上下文中查找名称遵循函数调用中名称查找的常规规则
在这里,foo::bar
是一个非限定名称,的意思是它不是由->
或
限定的。因此,本段适用。现在,短语“在上下文中查找”的含义在6.4第2段[基本查找]中解释:
名称“在表达式上下文中查找”在找到表达式的范围内作为非限定名称进行查找
但是,
foo::bar
是名称查找领域中的限定名称。换句话说,这种段落组合基本上表示,通过非限定名称查找规则查找限定名称foo::bar
。然而,我不认为非限定名称查找能够递归地进入更窄的范围,即foo
到bar
。这是缺陷吗?不,我不认为这是缺陷。上面说
按照函数调用中名称查找的常规规则,在函数调用的上下文中查找名称
从我突出显示的部分可以看到,标准指定了应该如何查找名称:按名称查找
名称查找涉及非限定、限定和参数相关的查找,因此您的名称确实由限定名称查找规则解析
“在expr上下文中查找”规则在这里不适用,因为它指定了使用什么规则。那一段只有在不合适的时候才起作用。例如,在:
模板id的模板参数中的名称在整个后缀表达式出现的上下文中查找
只是好奇,为什么在查找过程中使用哪些规则会引起人们的兴趣?如果它们包含在文档中,肯定有原因。
foo::bar()
仍然可以在另一个命名空间中。@Yucel_K这可能是文档中的一个缺陷,这就是为什么我在这里问这个问题。@Jarod42您能详细说明一下吗?我不确定您的评论与我的问题有何关联。虽然不确定“按评论”是否有效,但foo::bar
可能指的是N::foo::bar
,而不是::foo::bar
。(由于使用了
,而c.bar()
不能引用另一个名称空间
)。对于未来的观众,请注意,在这些段落中的上下文中查找的短语似乎没有特殊意义。在我看来,对6.4的明确引用(我在上面的引用中省略了)覆盖了其中的任何歧义,因此整个名称查找将进行,其中也包括限定名称查找。