3.4.1不合格的名称查找

时间:2010-09-01 12:15:54

标签: c++

根据C ++标准: -

  

名称查找规则统一适用于所有名称(包括typedef-names(7.1.3),namespace-names(7.3),concept-names(14.9),concept-map-names(14.9.2)和class -names(9.1))语法允许在特定规则讨论的上下文中使用这些名称。

名称查找规则是否适用在发生重载解析之前?

必须有一些我不理解的原因。

以下示例来自Nutshell中的Book C ++: -

void func(int i)
{
  std::cout << "int: " << i << '\n';
}



namespace N 
{
  void func(double d)
  {
    std::cout << "double: " << std::showpoint << d << '\n';
  }

  void call_func(  )
  {
    // Even though func(int) is a better match, the compiler finds
    // N::func(double) first.
    func(3);
  }
}

3 个答案:

答案 0 :(得分:9)

如果我在名称空间N中工作 我刚刚编写了一个名为func()的函数,然后我编写了一些代码来调用这个新函数。在使用我刚刚编写的函数之前,从另一个命名空间中选择一个函数似乎是违反直觉的。

现在考虑情况正好相反。

(即它使用重载决议)

我写了一个函数bob(double)。它完美地工作,因为与全局命名空间中的`bob(double)没有冲突。我编写代码,应用程序运行完美。

一年后,有人在全局命名空间中编写函数bob(int)并重新编译应用程序。突然间我的代码没有变化。我对bob(5)的所有调用都已重定向到全局命名空间中的bob(int)

这是应用程序工作的非常不受欢迎的方式。

答案 1 :(得分:1)

是。名称查找尝试查找在使用点可见的所有名称。一旦构建了名称声明的整个超集,就会在确定名称是函数名称的情况下完成重载解析。如果找到匹配的名称,则名称查找结束,否则失败。

如果名称查找成功,并且如果确定名称是函数名称,则执行重载解析以找到最佳可行函数(如果有)。随后进行访问检查以确定在访问的上下文中是否确实可以访问该名称。

请注意,名称的可见性对于名称查找非常重要,而不是可访问性。

答案 2 :(得分:0)

名称查找在重载解析之前运行。为了使编译器知道“调用哪个函数”,它按此顺序运行

  • 名字查询
  • 模板参数解析
  • 重载决议
  • 访问控制
  • 虚拟功能

为什么,您可以参考https://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr315.htm和第9频道http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

实际上,Overload-Resolution归结为最可行的函数的选择,即搜索与函数调用相对应的最合适的函数声明。

此搜索基于函数参数的数量,然后在“隐式转换序列”中发生在一组预先选择的函数中。如果要解析的呼叫是f(),则此集合包含名称为f()的所有函数,这些函数从代码中的某个点可见。此设置由名称查找确定。