2012-11-29 12 views
7

C++ 03標準の7.3.1.1 [namespace.unnamed]段落1:(およびC++ 11標準も同様の定義を使用)C++名前(匿名)名前空間定義

名前、ネームスペースでそれは単に定義は、次のされていないのはなぜそれが

namespace unique { /* empty body */ } 
using namespace unique; 
namespace unique { namespace-body } 

に置き換えられたかのように定義振る舞いますか?

namespace unique { namespace-body } 
using namespace unique; 

サイド質問:MSDNは後者の形式で定義します。標準に技術的に違反していますか?

+1

これは、 'namespace-body'では余分な修飾なしでエンティティにアクセスするため、' using namespace unique'が既に有効になっているためです。 –

+3

@matは名前空間のボディに入っています。あなたはいつもその名前空間に定義されているものを参照することができます。 –

+0

@ JohannesSchaub-litb:私は周りの環境との衝突の影響については疑問に思っていましたが –

答えて

7

あなたはもうこれを行うことができませんでし

namespace { typedef int a; ::a x; } 

注以降のnamespace { ... }では、突然、あなたができた。そのこれはひどく矛盾しているでしょう。

また、これはfintバージョンを呼び出して、ISO C++を持つ2つの異なる有効な成果

namespace A { void f(long); } 
using namespace A; 

namespace { 
    void f(int); 
    void g() { 
    ::f(0); 
    } 
} 

で、この場合に気づきます。代替定義では、longバージョンが呼び出されます。

+2

あなたの答えから、私が何を表現するのかを理解してください」ということです。標準の定義は、namespace-bodyで宣言された名前が、グローバル名前空間を使って完全修飾することによってnamespace-bodyで参照できることを保証します。例えば ​​..." –