使用指令的行为

Mit*_*iya 8 c++

我对使用指令感到困惑.

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

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

此外,C++ 11标准§7.3.4不处理限定名称查找.

因此,IMHO using-directive对限定名称查找没有影响.
例如,我认为以下示例代码应该导致编译错误.

#include <iostream>

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

int main()
{
    std::cout << A::i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是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
}
Run Code Online (Sandbox Code Playgroud)

这个例子说A::i函数h可以引用未命名的命名空间成员i.

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

你能告诉我使用指令的正确解释吗?

小智 2

有7.3.4

\n\n
\n

using 指令指定指定命名空间中的名称可以在该 using 指令出现在 using 指令之后的范围内使用。在非限定名称查找 (3.4.1) 期间,名称看起来就像是在最近的封闭命名空间中声明的,该命名空间同时包含 using 指令和指定命名空间。[ 注意:在此上下文中,\xe2\x80\x9ccontains\xe2\x80\x9d 表示 \xe2\x80\x9ccontains\n 直接或间接\xe2\x80\x9d。\xe2\x80\x94 尾注]

\n\n

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

\n
\n\n

上面的解释是,使用指令将名称拉入作用域,而不是声明(命名空间成员)本身。

\n\n

这或许可以说明这一点:

\n\n
namespace N {\n    template <typename T> void f() {};\n}\n\nusing namespace N;\n\n// error: specialization of \xe2\x80\x98template<class T> void N::f()\xe2\x80\x99 in different\n//        namespace\ntemplate <> void f<int>() {};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

应用一些小的改变:

\n\n
#include <iostream>\n\nnamespace { int i = 0; }    // unique::i\n\nnamespace A {\n    namespace {\n        int i = 1;          // A::unique::i\n    }\n}\n\nusing namespace A;\n\nint main () {\n    // i++; // error: unique::i or A::unique::i\n    // The i having the value 1:\n    std::cout << A::i << std::endl; // A::unique::i\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n