两个未命名的命名空间,在同一声明区域中定义

1 c++ namespaces unnamed-namespace

请考虑以下代码:

#include<iostream>

namespace
{
    int a = 5;
}

namespace
{
    int a = 5;
}
int main()
{ 
    int i=5;
    {
        std::cout << i;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但未命名的命名空间定义不是原始命名空间定义和秒.7.3.1/1说:

namespace-name:
    original-namespace-name
    namespace-alias
original-namespace-name:
    identifier
Run Code Online (Sandbox Code Playgroud)

original-namespace-definition:
    inline_opt namespace identifier { namespace-body }
Run Code Online (Sandbox Code Playgroud)

而且,秒.7.3.1.1说:

未命名的命名空间定义的行为就像被替换为

inlineopt namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }
Run Code Online (Sandbox Code Playgroud)

当且仅当它出现在unnamed-namespace-definition中时,inline才会出现,翻译单元中所有出现的unique都会被相同的标识符替换,并且此标识符与整个程序中的所有其他标识符不同.

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

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

Rei*_*ica 8

这是你引用的那篇文章:

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

因此,翻译单元中的所有未命名的命名空间都是相同的.