2016-03-24 11 views
9

Betrachten Sie diesen Code:Compiler Diskrepanz: Die Interaktion zwischen Alias-Auflösung und Namen-Suche

using type = long; 

namespace n { 
    using type = long; 
} 

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

Dies kompiliert sauber auf Clang 3.7 und GCC 5.3, aber MSVC 19 * gibt die folgende Fehlermeldung:

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

Ist das gut formatiert? Welcher Teil des Standards notiert, ob der Alias ​​vor der Mehrdeutigkeitsprüfung aufgelöst wird?

Beachten Sie, dass Clang und GCC beide ähnliche Fehler zu MSVC geben, wenn Sie einen dieser Aliase ändern.

Ich bin mir voll bewusst, wie qualifiziert der Name die Mehrdeutigkeit lösen würde, ich bin nur daran interessiert, was der Standard dazu sagen muss.


* - einfach den Code einfügen und zu diesem Link laufen, ich weiß nicht, ob es mit Permalinks

ein Online-MSVC Compiler ist

Antwort

4

[namespace.udir]/6:

Wenn Namenssuche findet ein Deklaration für einen Namen in zwei verschiedenen Namespaces, und die Deklarationen deklarieren nicht die gleiche Entität und deklarieren keine Funktionen, die Verwendung des Namens ist schlecht gebildet.

Diese deklarieren jedoch den Namen, um auf den gleichen Typ zu verweisen, daher sollte das Programm wohlgeformt sein. Diese Interpretation ist z.B. durch die Kommentare in core issue 1894 bestätigt:

//[..] 

    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:

Wenn Namenssuche eine Erklärung für einen Namen in zwei verschiedenen Namensräumen findet, und die Erklärungen nicht erklären, die gleiche Einheit und tun nicht erklären Funktionen, die Verwendung des Namens ist schlecht gebildet

+1

Meinst du das ernst? – Columbo

+0

@Columbo, ich habe meine Antwort gepostet, bevor ich deine gesehen habe. Ich würde es selbst entfernen, aber ich werde es jetzt verlassen - es war falsch, wer auch immer es getan hat. – SergeyA

Verwandte Themen