2015-07-16 47 views
9

aşağıdaki programı düşününFarklı davranış gerçekleştiren nitelikli ad arama

prog.cc:10:22: error: 'N' (aka 'int') is not a class, namespace, or 
enumeration 
    std::cout << N::j << std::endl; 
       ^1 error generated. 

GCC herhangi derleyici hata vermez . Hata raporunu hangi derleyiciye vermem gerektiğini bulmaya çalışıyorum. Hangi derleyicinin doğru davranışı vardır ve neden (C++ standardına referanslar)?

Wandbox - Clang: http://melpon.org/wandbox/permlink/s0hKOxCFPgq5aSmJ

Wandbox - GCC: http://melpon.org/wandbox/permlink/i2kOl3qTBVUcJVbZ

cevap

11

Clang Bu sefer doğrudur. Teklif C++ 11, 3.4.3/1 [basic.lookup.qual]: Bu madde başına

... If a :: scope resolution operator in a nested-name-specifier is not preceded by a decltype-specifier, lookup of the name preceding that :: considers only namespaces, types, and templates whose specializations are types. If the name found does not designate a namespace or a class, enumeration, or dependent type, the program is ill-formed.

, türleri arama esnasında dikkat edilmesi gereken, bu nedenle Typedef N bulunmalıdır. Ve bir ad alanı, sınıf, numaralandırma veya bağımlı tip belirlemediğinden, program kötü biçimlendirilmiştir.

+0

Ancak "Ill Formed" programları, "tanımlanmamış davranış" gibi bir bit değildir, derleyici için mükemmel bir şekilde geçerlidir, a) bir hata vermez ve b) bir şekilde çalışan kodlar üretir. burnunu uçurun] (büyük değil dememeliyim, sadece, değil, teknik olarak, derleyici bir hata üretmek için yanlış değil) –

+1

Teşekkürler! Bildirildi: https://gcc.gnu.org/bugzilla /show_bug.cgi?id=66900 – Supremum

+4

@MatsPetersson Standart, "kötü biçimlendirilmiş" dediğinde gerekli bir tanılamayı ifade eder. Tanıya gerek duyulmadığında, genellikle "programın biçimlendirilmiş, teşhis gerektirmez" olduğunu söyler ve tanımlanmamış durumlarda "davranış tanımsızdır." – 0x499602D2