特殊的C++ [Bug]?

Gau*_*mar 12 c++

我一直在读Exceptional C++ by Herb Sutter.到达时Item 32

我找到了以下内容

 namespace A 
 {
     struct X;
     struct Y;
     void f( int );
     void g( X );
 }
 namespace B
 {
     void f( int i )
     {
        f( i );   // which f()?
     }
 }
Run Code Online (Sandbox Code Playgroud)

这个f()调用自身,具有无限递归.原因是唯一可见的f()是B :: f()本身.

还有另一个带有签名f(int)的函数,即命名空间A中的函数.如果B写了"使用命名空间A"; 或者"使用A :: f;",当查找f(int)时,A :: f(int)将作为候选者可见,并且f(i)调用在A :: f之间是不明确的( int)和B :: f(int).由于B没有将A :: f(int)带入范围,因此只能考虑B :: f(int),因此调用明确地解析为B :: f(int).

但是当我做了以下......

 namespace A 
 {
     struct X;
     struct Y;
     void f( int );
     void g( X );
 }
 namespace B
 {
     using namespace A;
     void f( int i )
     {
        f( i );   // No error, why?
     }
 }
Run Code Online (Sandbox Code Playgroud)

这意味着Herb Sutter完全错了吗?如果不是为什么我不会收到错误?

CB *_*ley 18

using声明(using A::f)和using指令(using namespace A)之间存在细微差别.

using声明在使用它的作用域中引入了一个名称,因此在不明确的定义中using A::f进行调用.fB::f(int)

using定义使命名空间的成员在使用它的作用域中可见,但它们看起来好像名称来自引入的命名空间的最近公共作用域和使用using指令的名称空间.这意味着using namespace A;在这种情况下,使另一个f看起来好像它是在全局范围内声明但它仍然被隐藏B::f(int).

(ISO/IEC/BS 14882:2003 7.3.4 [namespace.udir]/1适用于所有标准爱好者.)