次のコードを検討してください。
#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-name によって示される潜在的なスコープは、そのoriginal-namespace-nameを持つ同じ宣言領域内の名前空間定義のそれぞれによって確立された宣言領域の連結です 。[...]
しかし、名前のない名前空間の定義は、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 は次のように述べています。
unnamed-namespace-definition は、
inlineopt namespace unique { /* empty body */ } using namespace unique ; namespace unique { namespace-body }
inline は、unnamed-namespace-definition に出現する場合にのみ出現し、翻訳単位内のすべての一意の出現は同じ識別子に置き換えられ、この識別子はプログラム全体の他のすべての識別子とは異なります。
これは、名前のない 2 つの名前空間が異なるuniqueを持っていることを意味します。
私が引用したコードの動作を説明できますか?