2016-03-24 11 views
9

Considerate questo codice:Compiler discrepanza: Interazione tra la risoluzione alias e nome di ricerca

using type = long; 

namespace n { 
    using type = long; 
} 

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

Questo compila in modo pulito sulla Clang 3.7 e GCC 5.3, ma MSVC 19 * ha pronunciato la seguente messaggio di errore:

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

È questo codice ben formato? Quale parte delle note standard indica se l'alias viene risolto prima dei controlli di ambiguità?


Nota che Clang e GCC danno entrambi errori simili a MSVC se si modifica uno di questi alias.

Sono pienamente consapevole di quanto la definizione del nome possa risolvere l'ambiguità, sono solo interessato a ciò che lo standard ha da dire al riguardo.


* - Basta incollare il codice ed eseguirlo a quel link, non so se c'è un compilatore in linea MSVC con permalinks

risposta

4

[namespace.udir]/6:

Se nome ricerca trova un dichiarazione per un nome in due diversi spazi dei nomi, e le dichiarazioni non dichiarano la stessa entità e non dichiarano funzioni, l'uso del nome è mal formato.

Tuttavia, questi dichiarano il nome per riferirsi allo stesso tipo, quindi il programma dovrebbe essere ben formato. Questa interpretazione è ad es. confermata dai commenti in 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:

Se il nome di ricerca trova una dichiarazione di un nome in due diversi spazi dei nomi, e le dichiarazioni non si dichiara la stessa entità e fare non dichiarare funzioni, l'uso del nome è malformato

+1

Sei serio? – Columbo

+0

@Columbo, ho postato la mia risposta prima di aver visto la tua. Vorrei rimuoverlo da solo, ma lo lascerò ora - facendo downvoting è stato sbagliato su chiunque lo abbia fatto. – SergeyA

Problemi correlati