我一直在阅读 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()?
     }
 }



但是当我做了以下..
 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?
     }
 }

这意味着赫伯·萨特完全错了?如果不是为什么我没有收到错误?

最佳答案

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

using 声明将名称引入使用它的范围,因此 using A::f 使 f 定义中对 B::f(int) 的调用产生歧义。

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

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

关于c++ - 出色的 C++[Bug]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3039615/

10-15 02:15