我对使用指令感到困惑.
根据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\n\nusing 指令指定指定命名空间中的名称可以在该 using 指令出现在 using 指令之后的范围内使用。在非限定名称查找 (3.4.1) 期间,名称看起来就像是在最近的封闭命名空间中声明的,该命名空间同时包含 using 指令和指定命名空间。[ 注意:在此上下文中,\xe2\x80\x9ccontains\xe2\x80\x9d 表示 \xe2\x80\x9ccontains\n 直接或间接\xe2\x80\x9d。\xe2\x80\x94 尾注]
\n\nusing 指令不会将任何成员添加到它出现的声明性区域。
\n
上面的解释是,使用指令将名称拉入作用域,而不是声明(命名空间成员)本身。
\n\n这或许可以说明这一点:
\n\nnamespace 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>() {};\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n