2016-03-24 10 views
9

Rozważmy następujący kod:Compiler rozbieżność: Interakcje pomiędzy rozdzielczości alias i nazwa odnośnika

using type = long; 

namespace n { 
    using type = long; 
} 

using namespace n; 
int main() { 
    type t; 
} 

To kompiluje czysto na Clang 3.7 i GCC 5.3, ale MSVC 19 * daje się następujący komunikat o błędzie:

main.cpp(9): error C2872: 'type': ambiguous symbol 
main.cpp(1): note: could be 'long type' 
main.cpp(4): note: or  'n::type' 

Czy ta kod dobrze sformułowany? Jaka część standardu odnotowuje, czy alias jest rozwiązywany przed sprawdzaniem niejednoznaczności?


Należy pamiętać, że Clang i GCC zarówno dają podobne błędy do MSVC, jeśli zmienisz jeden z tych aliasów.

Jestem w pełni świadomy tego, jak kwalifikowanie nazwy rozwiązałoby niejednoznaczność, interesuje mnie tylko to, co standard ma do powiedzenia na ten temat.


* - Wystarczy wkleić kod i uruchomić go w ten link, nie wiem, czy jest online kompilator MSVC z permalinks

Odpowiedz

4

[namespace.udir]/6:

Jeżeli wyszukiwanie nazw znajdzie deklaracja dla nazwy w dwóch różnych przestrzeniach nazw i deklaracje nie deklarują tego samego podmiotu i nie deklarują funkcji, użycie nazwy jest źle sformułowane.

Jednak deklarują one nazwę tego samego typu, dlatego program powinien być dobrze sformułowany. Taką interpretacją jest np. Potwierdzają to komentarze w core issue 1894:

//[..] 

    namespace C { 
    // The typedef does not redefine the name S in this 
    // scope, so issue 407's resolution does not apply. 
    typedef A::S S; 
    using A::S; 
    // **The name lookup here isn't ambiguous, because it only finds one 
    // entity**, but it finds both a typedef-name and a non-typedef-name referring 
    // to that entity, so the standard doesn't appear to say whether this is valid. 
    struct S s; 
    } 
-1

7.3.4/6:

Jeżeli wyszukiwanie nazw stwierdza oświadczenie o nazwę w dwóch różnych przestrzeniach nazw i deklaracje nie deklaruje ten sam podmiot, i czy nie deklaruje funkcji, użycie nazwy jest źle sformułowane

+1

Czy mówisz poważnie? – Columbo

+0

@ Columbo, wysłałem swoją odpowiedź, zanim zobaczyłem twoją. Sam go usunąłabym, ale zostawię to teraz - nieważne, że to było złe dla tego, kto to zrobił. – SergeyA