2012-11-29 21 views
7

C++ 03 Standart 7.3.1.1 [namespace.unnamed] paragraf 1: (C++ 11 Standart da benzer bir tanım kullanımı)C++ adsız (Anonim) ad tanımı

bir isimsiz-namespace- o niye basitçe tanımı takip ediyor değil

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

yerini sanki tanımı
davranır?

namespace unique { namespace-body } 
using namespace unique; 

Yan soru: İkinci form tarafından MSDN tanımlar. Standard'ı teknik olarak ihlal ediyor mu?

+1

Bunun nedeni, 'namespace-body'da, ekstra niteliğe sahip olmayan varlıklara erişmenizdir. –

+3

@mat Bir isim alanının gövdesinde, her zaman bu isim alanında tanımlanmış şeylere atıfta bulunabilirsiniz. –

+0

@ JohannesSchaub-litb: Biliyorum, Çatışmaların çevreyle olan etkisini merak ediyordum ama –

cevap

7

Artık bunu müteakip namespace { ... } yılında aniden yaparsın

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

Not Bu yapamadı. Bu korkunç bir tutarsızlık olurdu.

Ayrıca ISO C++ ile iki farklı geçerli sonuçların

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

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

ile, bu davayı fark, bu f ait int sürümünü çağırır. Alternatif tanımınızla, long sürümünü çağırır.

+2

cevabınızdan ne ifade ettiğimi ifade etmek istediğimi anlatayım, “standarttaki tanım, isim-bedeninde bildirilen isimlerin, ad alanı-bedeninde, genel ad alanını kullanarak tam olarak nitelendirilmesiyle anılmasını sağlar. Örneğin ..." –