使用指令的行为

时间:2013-12-31 07:42:50

标签: c++

我对使用-directive感到困惑。

根据C ++ 11标准§7.3.4p.3,

using-directive不会将任何成员添加到它出现的声明区域。

此外,C ++ 11标准§7.3.4不涉及限定名称查找。

因此,恕我直言使用指令对限定名称查找没有影响 例如,我认为以下示例代码应该导致编译错误。

#include <iostream>

namespace A {
    namespace B {
        int i = 1;
    }
    using namespace B;
}

int main()
{
    std::cout << A::i << std::endl;
}

但是gcc和clang都成功编译了这段代码。 (http://melpon.org/wandbox/permlink/rXPjE5k12yMtlvMg

此外,C ++ 11标准§7.3.1.1表明,未命名的命名空间定义的行为就像被

替换一样
inlineopt namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }

并显示以下示例(省略了不必要的部分)。

namespace { int i; }    // unique::i

namespace A {
    namespace {
        int i;          // A::unique::i
    }
}

using namespace A;
void h() {
    i++;                // error: unique::i or A::unique::i
    A::i++;             // A::unique::i
}

此示例表示函数A::i的{​​{1}}可以引用未命名的命名空间成员h

帮助我,我再也听不懂了。

你能教会我对using指令的正确解释吗?

1 个答案:

答案 0 :(得分:2)

有7.3.4

  

using-directive指定指定名称空间中的名称   可以在using指令出现的范围内使用   使用指令。在非限定名称查找(3.4.1)期间,   名称看起来好像是在最近的封闭中声明的   包含using-directive和指定的namespace   命名空间。 [注意:在此上下文中,“包含”表示“包含”   直接或间接地“。 - 结束说明]

     

using-directive不会将任何成员添加到声明性区域   它出现在哪里。

上面的解释说,using-directive是将名称拉入范围,而不是声明(命名空间成员), 本身。

这可能说明了这一点:

namespace N {
    template <typename T> void f() {};
}

using namespace N;

// error: specialization of ‘template<class T> void N::f()’ in different
//        namespace
template <> void f<int>() {};

在第二个示例中,有两个未命名的命名空间:

应用一些小改动:

#include <iostream>

namespace { int i = 0; }    // unique::i

namespace A {
    namespace {
        int i = 1;          // A::unique::i
    }
}

using namespace A;

int main () {
    // i++; // error: unique::i or A::unique::i
    // The i having the value 1:
    std::cout << A::i << std::endl; // A::unique::i
    return 0;
}