2015-11-11 24 views
6

La seguente definizione del namespace non viene compilata quando la prima dichiarazione viene commentata. Se la prima dichiarazione di foo non è commentata, allora viene compilata correttamente.qualifica esplicita nella dichiarazione C++

namespace Y 
{ 
    //void foo(); 
    void ::Y::foo(){} 
} 

La parte rilevante nello standard (§8.3¶1) dice:

Quando il dichiaratore-id è qualificato, la dichiarazione deve fare riferimento a un membro precedentemente dichiarato

Comprendo che questa regola impedisce l'introduzione di nomi in altri spazi dei nomi. Mi chiedo se tale regola potrebbe essere rilassata per consentire qualificata-id riferendosi allo spazio dei nomi corrente.

+1

Alla persona che ha votato per la chiusura perché non è chiaro cosa sto chiedendo: La domanda è già nel testo: * C'è qualche problema se questa regola è rilassata per consentire l'identificazione qualificata riferendosi allo spazio corrente? * – Hector

+1

Hai un caso d'uso valido per questa regola di rilassamento? –

+0

@KarolyHorvath: define "valid" ;-) ... la generazione automatica di codice potrebbe avvantaggiare se tutti gli identificatori potessero includere i loro ambiti. Si noti che questo riguarderebbe programmi che scrivono programmi non necessariamente per il consumo umano. – Hector

risposta

3

CWG #482 è rilevante:

Secondo 8.3 [dcl.meaning] paragrafo 1, [...]
Questa restrizione vieta esempi come il seguente:

void f(); 
void ::f();  // error: qualified declarator 

namespace N { 
    void f(); 
    void N::f() { } // error: qualified declarator 
} 

Ci non sembra essere una buona ragione per non autorizzare tali dichiarazioni , e un certo numero di implementazioni le accetta nonostante la proibizione dello Standard a . Lo standard dovrebbe essere cambiato per consentire loro?

Note dal aprile 2006 riunione:

Nel discutere issue 548, il CWG convenuto che il divieto di dichiaratori qualificati all'interno del loro spazio dei nomi deve essere rimosso.

Così il vostro codice è valido se la prima dichiarazione di foo è presente (come di circa 2012; GCC ha un open bug report). In caso contrario, tuttavia, la formulazione citata si applica ancora e rende mal formulata la dichiarazione qualificata. Non vedo alcun motivo per autorizzare quel caso; implica in modo intuitivo che il nome è già stato dichiarato, poiché la ricerca del nome qualificato deve determinare a cosa si riferisce.