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



考虑以下代码:

#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出现在未命名的名称空间定义,在翻译单元被替换为相同的标识符,而这标识符不同于整个程序中的所有其他标识符

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

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

就在你引用的那篇文章里:

所有在翻译单元中出现的唯一的都用相同的标识符

替换

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

相关内容

  • 没有找到相关文章

最新更新