这是代码示例:
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)中找到:
名称查找将名称的使用与该名称的一组声明相关联.通过名称查找找到的声明应全部声明同一实体或全部声明功能; 在后一种情况下,声明被称为形成一组重载函数.
查找用于函数调用的非限定名称有两个阶段:
即使在查找用于函数调用的名称时,非限定名称查找规则也会查找该名称的任何声明. (规则并不是它只搜索该名称的函数声明).这个阶段同时找到::k并::A::k不管这些是否是函数,intS,或什么的.
依赖于参数的查找确实有一条规则,即只查找该部分查找的函数声明.但这与此代码无关.
using[basic.lookup.unqual]/2涵盖了该指令的相关行为(由我编辑,只显示与此问题相关的部分):
出于非限定名称查找规则的目的,using-directive指定的命名空间中的声明被视为该封闭命名空间的成员.
这澄清了using namespace A;实际上没有将成员A纳入范围main(); 但这意味着当在全局命名空间中查找名称时(因为这是使用声明的站点的最里面的封闭命名空间),A也会在那里找到名称.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |