2015-07-16 17 views
9

Si consideri il seguente programma:comportamenti differenti tra Clang e GCC quando si esegue la ricerca del nome qualificato

#include <iostream> 

namespace N { 
    int j = 1; 
} 

namespace M { 
    typedef int N; 
    void f() { 
     std::cout << N::j << std::endl; 
    } 
} 

int main() { M::f(); } 

compilazione con clangore ha pronunciato la seguente errore del compilatore:

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 non dà alcun errore di compilazione . Sto cercando di capire per quale compilatore dovrei presentare la segnalazione di errore. Quale compilatore ha il comportamento corretto e perché (riferimenti allo standard C++)?

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

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

risposta

11

Clang è corretta su questo. Citando C++ 11, 3.4.3/1 [basic.lookup.qual]:

... 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.

Per questa clausola, si suppone tipi da considerare durante la ricerca, in modo che il typedef N dovrebbe essere trovato. E dal momento che non designa uno spazio dei nomi, classe, enumerazione o tipo dipendente, il programma è mal formato.

+0

Ma non è un programma "Ill Formed" un po 'come "comportamento indefinito", che è perfettamente valido per il compilatore a) non dare un errore eb) produrre codice che funziona in qualche modo [anche correttamente o rendendo i demoni volare fuori il naso] (Non dire che un grande non dovrebbe essere sollevato, solo che non è, tecnicamente, sbagliato avere il compilatore NON produce un errore] –

+1

Grazie! Bug segnalato: https://gcc.gnu.org/bugzilla /show_bug.cgi?id=66900 – Supremum

+4

@MatsPetersson Lo standard implica una diagnostica richiesta quando dice "mal formato". In genere si dice "il programma è mal formato, non è necessaria alcuna diagnostica" quando non è richiesta una diagnostica e "il comportamento è indefinito" in casi non definiti – 0x499602D2

Problemi correlati