2013-04-11 6 views
24

In 6.8.3 der C++ 11-Standard heißt es:Beispiel für C++ 11 Template-Parameter fehlbindend?

Wenn während der Analyse wird ein Name in einem Template-Parameter gebunden anders als es bei einem Versuch Parse gebunden wäre, das Programm ist schlecht gebildet.

Was ist ein Beispiel für ein Programm, das als Folge dieser Anforderung schlecht aussieht?

+15

Ein "Testparse" ist, wenn Sie nicht die Vollversion des Compilers kaufen. –

+0

Siehe untenstehenden Kommentar für die eigentliche Definition von 'Trial Parse'. –

Antwort

27
#include <iostream> 
#include <typeinfo> 

typedef const int cint; 

template <int a> struct x 
{ 
    static cint b = 0; 
}; 

template <> struct x<42> 
{ 
    typedef cint b; 
}; 

cint w = 17; 

int main() 
{ 
    cint (w)(42), (z)(x<w>::b); 

    std::cout << typeid(z).name() << std::endl; 
} 

Die erste Erklärung in main() muss eindeutig gemacht werden, so dass ein Versuch Parsing durchgeführt wird. Während dieses Parsens ist das lokale w unbekannt, da das Parse rein syntaktisch ist (Dinge werden nur geparst, es werden keine semantischen Aktionen durchgeführt). Folglich ist w eine globale Konstante, ihr Wert ist 17, x<w>::b ist ein Wert und z ist eine Variable.

Während der realen Analyse finden semantische Aktionen statt. Somit ist der Name w an die frisch deklarierte lokale Konstante gebunden, sein Wert ist 42, x<w>::b wird zu einem Typ, und z ist eine Funktionsdeklaration.

+0

(+1) Muss der Compiler eine Diagnose ausgeben? 'gcc 4.7.2' nicht. – NPE

+0

"Wenn beim Parsen ein Name in einem Template-Parameter anders gebunden wird, als er während eines Test-Parsers gebunden wäre, ist das Programm fehlerhaft. Es ist keine Diagnose erforderlich." – zakinster

+0

Ja, es wird während des Versuchs ausgewertet. Ich sehe keine Anforderung, einen Fehler zu werfen, der Standard sagt "keine Diagnose ist erforderlich". –