【发布时间】:2012-09-13 01:07:15
【问题描述】:
来自 c++11 标准的第 7.3.4.2 节:
using-directive 指定指定命名空间中的名称 可以在using-directive之后出现的范围内使用 使用指令。在非限定名称查找 (3.4.1) 期间,名称 看起来好像它们是在最近的封闭命名空间中声明的 其中包含 using-directive 和指定的命名空间。 [ 注:在此上下文中,“包含”是指“直接包含或 间接”。 ——尾注]
第二句和第三句究竟是什么意思?请举例。
这是我试图理解的代码:
namespace A
{
int i = 7;
}
namespace B
{
using namespace A;
int i = i + 11;
}
int main(int argc, char * argv[])
{
std::cout << A::i << " " << B::i << std::endl;
return 0;
}
它打印的是“7 7”,而不是我期望的“7 18”。
抱歉打错了,程序实际打印的是“7 11”。
【问题讨论】:
-
这里的行为是未定义的。
namespace B内部的两个i实例都引用同一个变量(只要看到它的 declarator,即在初始化程序之前,它就会隐藏A::i)。所以它被初始化为自己的垃圾值增加了 11。 -
好吧,为什么它会在
using namespace A之后隐藏A::i。这就是标准中的段落所说的吗? -
@ThomasMcLeod:这就是阴影的意思:隐藏了定义。由于您没有限定在表达式中对
i的使用,它从查找中获取。由于 C++ 允许您引用刚刚在初始化表达式中定义的变量,i将是新变量,而不是来自A的变量。 -
这里让我觉得很奇怪,也就是说,它允许在编译时添加非常量数据?
-
由于与昨天完全相同的原因,它仍然未定义。
标签: c++ namespaces c++11 standards using-directives