考虑以下代码:
#include<iostream>
namespace
{
int a = 5;
}
namespace
{
int a = 5;
}
int main()
{
int i=5;
{
std::cout << i;
}
}
此代码无效。这是因为发生了对a
的重新定义。但我认为这是有效的。实际上,第3.3.6/1节说:
[…由original- namspace -name表示的潜在作用域是建立的声明性区域的连接名称空间-与该名称空间在同一声明性区域中的定义 original-namespace-name 。[…]
但是未命名的命名空间定义不是原始命名空间定义,并且第7.3.1/1节说:
namespace-name:
original-namespace-name
namespace-alias
original-namespace-name:
identifier
和
original-namespace-definition:
inline_opt namespace identifier { namespace-body }
而且,第7.3.1.1节说:
未命名的命名空间定义的行为就像被
取代一样。inlineopt namespace unique { /* empty body */ } using namespace unique ; namespace unique { namespace-body }
当且仅当inline出现在未命名的名称空间定义,在翻译单元被替换为相同的标识符,而这标识符不同于整个程序中的所有其他标识符。
这意味着两个未命名的命名空间具有不同的唯一的。
你能解释一下我引用的代码中的行为吗?
就在你引用的那篇文章里:
所有在翻译单元中出现的唯一的都用相同的标识符
替换
翻译单元中所有未命名的命名空间都是相同的