1

考虑以下代码:

#include<iostream>

namespace
{
    int a = 5;
}

namespace
{
    int a = 5;
}
int main()
{ 
    int i=5;
    {
        std::cout << i;
    }
}

此代码无效。这是因为a发生了重新定义。但我预计这是有效的。实际上,秒。3.3.6/1 说:

[...]由原始命名空间名称表示的潜在范围是由同一声明区域中的每个命名空间定义与该 原始命名空间名称建立的声明区域的串联。[...]

但是未命名的命名空间定义不是 original-namespace-definition 和 sec。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 出现当且仅当它出现在 unnamed-namespace-definition 中时,翻译单元中所有出现的 unique 都被相同的标识符替换,并且该标识符不同于整个程序中的所有其他标识符

这意味着两个未命名的命名空间具有不同的唯一性。

你能解释我引用的代码中的行为吗?

4

1 回答 1

8

它在你引用的那篇文章中:

翻译单元中所有出现的唯一性都被相同的标识符替换

因此,翻译单元中的所有未命名命名空间都是同一个。

于 2014-06-25T13:27:14.400 回答