2015-10-28 15 views
5

VS2015 compila ed esegue il seguente snippet senza problemi. g ++ e clang non collegano il codice e penso che siano corretti.La mia comprensione di [basic.link]/7 in N4140 è corretta?

#include <iostream> 

namespace X { 
    void p() { 
     void q(); // This is a block scope declaration of the function q() with external 
        // linkage (by §3.5/6), which then must be defined in namespace X, 
        // according to §3.5/7, and not in the global namespace. 
     q(); 
    } 
} 

void q() { std::cout << "q()" << '\n'; } 

int main() 
{ 
    X::p(); 
} 

risposta

4

Il vostro esempio è quasi identica a quella in [basic.link]/7 - Sì, la tua interpretazione è corretta.
L'utilizzo di una funzione non definita q rende il programma non corretto NDR. Quindi VC++ è tecnicamente conforme. Tuttavia, si vuole assolutamente segnalarlo.

Si noti come VC++ produces the same output ("q()"), anche se aggiungiamo una definizione di interno di q:

namespace X { 
    void p() { 
     void q();      
     q(); 
    } 

    void q() { std::cout << "This would be right"; } 
} 

void q() { std::cout << "q()" << '\n'; } 

... ma ha un comportamento sensato when extern is used.

+0

Perché NDR? Non dovrebbe il linker segnalare un errore in questo caso? – Belloc

+0

@Belloc L'implementazione dovrebbe ma non è richiesta. – Columbo

+0

Da dove hai ricevuto questo rapporto di mancato recapito? – Belloc

Problemi correlati