2015-07-16 2 views
9

Considérez le programme suivant:comportement différent entre Clang et GCC lors de l'exécution nom qualifié recherche

#include <iostream> 

namespace N { 
    int j = 1; 
} 

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

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

Compiler avec clang donne l'erreur de compilation suivante:

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 ne donne aucune erreur de compilation . J'essaye de comprendre pour quel compilateur je devrais classer le rapport de bogue pour. Quel compilateur a le bon comportement et pourquoi (références à la norme C++)?

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

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

Répondre

11

Clang est correcte sur celui-ci. C++ 11 cite, 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.

Par cette clause, les types sont censés être pris en considération au cours de la recherche, donc il faut rechercher les typedef N. Et comme il ne désigne pas un espace de noms, une classe, une énumération ou un type dépendant, le programme est mal formé.

+0

Mais "Ill Formed" ne ressemble pas à un "comportement indéfini", il est parfaitement normal pour le compilateur de: a) ne pas donner d'erreur et b) produire un code qui fonctionne d'une manière ou d'une autre volez votre nez] (Ne pas dire un gros ne devrait pas être soulevé, juste que ce n'est pas, techniquement, faux d'avoir le compilateur PAS produire une erreur] –

+1

Merci! Bug signalé: https://gcc.gnu.org/bugzilla /show_bug.cgi?id=66900 – Supremum

+4

@MatsPetersson La norme implique un diagnostic obligatoire quand elle est dite "mal formée" Elle indique typiquement "le programme est mal formé, aucun diagnostic requis" quand un diagnostic n'est pas requis, et "le comportement n'est pas défini" dans des cas non définis – 0x499602D2