我对使用-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指令的正确解释吗?
答案 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;
}