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-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を持っていることを意味します。

私が引用したコードの動作を説明できますか?

4

1 に答える 1

8

それはあなたが引用したまさにその部分にあります:

翻訳単位内のすべての一意の出現は、同じ識別子に置き換えられます

したがって、翻訳単位内の名前のない名前空間はすべて同じです。

于 2014-06-25T13:27:14.400 に答える