为什么int对象和函数类型之间不明确?

big*_*iao 2 c++ c++11

这是代码示例:

namespace A
{
  int k;
}
void k(int,int){/*dosomething*/}
int main()
{
  using namespace A;
  k(1,1);//ooop!k is ambiguous!
}
Run Code Online (Sandbox Code Playgroud)

发生了什么?我认为它不应该是模糊的,因为它们是不同的类型.为什么它含糊不清?有了int k它是不可能的k(1,1).

所以它与名称实际上没有任何关系?即使一个不是函数类型的名称在使用时也会引起歧义k(1,1),这在语法中是错误的,因为int k它不是函数?

M.M*_*M.M 10

查找名称k是不明确的,因为有两个匹配的声明可见,::k::A::k.

确切的规则可以在C++标准(N4659 [basic.lookup]/1)中找到:

名称查找将名称的使用与该名称的一组声明相关联.通过名称查找找到的声明应全部声明同一实体或全部声明功能; 在后一种情况下,声明被称为形成一组重载函数.


查找用于函数调用的非限定名称有两个阶段:

  1. 不合格的名称查找
  2. 依赖于参数的名称查找.

即使在查找用于函数调用的名称时,非限定名称查找规则也会查找该名称的任何声明. (规则并不是它只搜索该名称的函数声明).这个阶段同时找到::k::A::k不管这些是否是函数,intS,或什么的.

依赖于参数的查找确实有一条规则,即只查找该部分查找的函数声明.但这与此代码无关.


using[basic.lookup.unqual]/2涵盖了该指令的相关行为(由我编辑,只显示与此问题相关的部分):

出于非限定名称查找规则的目的,using-directive指定的命名空间中的声明被视为该封闭命名空间的成员.

这澄清了using namespace A;实际上没有将成员A纳入范围main(); 但这意味着当在全局命名空间中查找名称时(因为这是使用声明的站点的最里面的封闭命名空间),A也会在那里找到名称.

  • @bigxiao为什么不呢.这是它的目的. (2认同)