请考虑以下代码:
#include<iostream>
namespace
{
int a = 5;
}
namespace
{
int a = 5;
}
int main()
{
int i=5;
{
std::cout << i;
}
}
此代码无效。这是因为发生了a
的重新定义。但我希望这是有效的。实际上,秒。 3.3.6 / 1说:
[...] 原始命名空间名称表示的潜在范围是 每个人建立的声明区域的连接 与之相同的声明性区域中的名称空间定义 的原始名称空间名称即可。[...]
但未命名的命名空间定义不是原始命名空间定义和秒。 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说:
unnamed-namespace-definition的行为就像它被
替换一样inlineopt namespace unique { /* empty body */ } using namespace unique ; namespace unique { namespace-body }
当且仅当内联出现在内容中时,内联出现 unnamed-namespace-definition,a中所有出现的唯一 翻译单元由相同的标识符替换,并且这个 标识符与整个程序中的所有其他标识符不同。
这意味着两个未命名的命名空间具有不同的 唯一 。
你能解释我引用的代码中的行为吗?
答案 0 :(得分:8)
你引用的那篇:
翻译单元中出现的所有唯一都将替换为相同的标识符
因此,翻译单元中的所有未命名的命名空间都是相同的。