c++ - C ++:在主函数与全局范围中使用指令语句
问题描述
以下代码会导致错误,因为它没有::x
在全局范围内考虑。
#include<iostream>
namespace nspace
{
int x = 2;
}
int main()
{
using namespace nspace;
std::cout << ::x; //error: ‘::x’ has not been declared
return 0;
}
以下代码导致输出 2 没有任何编译错误。
#include<iostream>
namespace nspace
{
int x = 2;
}
using namespace nspace;
int main()
{
std::cout << ::x; // Outputs 2
return 0;
}
我的印象是,如果我们在主函数中使用指令与在全局范围内使用指令,那么就主函数而言,它是相同的。对于主要功能,两者都应该nspace::x
在全局范围内引入。两者都应该导致相同的行为。但上面的代码与我的理解相矛盾。
因此,如果您可以向我指出标准中的一些文本来澄清上述行为,那么这将是有帮助的。
解决方案
命名空间 N 中的限定名称查找额外搜索 N 的内联命名空间集 ([namespace.def]) 的每个元素。如果没有找到,则查找的结果是在每个命名空间中的限定名称查找的结果,该命名空间由一个using 指令指定,该指令位于查找点之前并位于 N 或 N 的内联命名空间集的元素中。
在第一种情况下,位于函数using namespace nspace;
内部的块范围内main
,因此不予考虑。
在第二种情况下,using namespace nspace;
它位于全局命名空间范围内,因此在全局范围内通过查找来考虑。