2013-04-11 30 views
24

W 6.8.3 średnia C++ 11 mówi:Przykład mylnego parametru parametru szablonu C++ 11?

Jeżeli podczas parsowania, nazwa w parametrze szablonu jest zobowiązany inaczej niż byłoby zobowiązane podczas próby parse, program jest źle sformułowany.

Jaki jest przykład programu źle sformułowanego w wyniku tego wymogu?

+15

"Analiza próbna" dotyczy sytuacji, gdy nie kupisz pełnej wersji kompilatora. –

+0

Zobacz komentarz poniżej do faktycznej definicji "analizy próbnej". –

Odpowiedz

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; 
} 

Pierwsza deklaracja w main() należy ujednoznacznione, więc parse trial jest wykonywana. Podczas tego przetwarzania lokalny w jest nieznany, ponieważ parsowanie jest czysto syntaktyczne (rzeczy są analizowane, nie są wykonywane żadne działania semantyczne). W konsekwencji w jest stałą globalną, jej wartość to 17, x<w>::b jest wartością, a z jest zmienną.

Podczas prawdziwej analizy wykonywane są akcje semantyczne. Dlatego nazwa w jest powiązana ze świeżo zadeklarowaną stałą lokalną, jej wartość wynosi 42, x<w>::b staje się typem, a z jest deklaracją funkcji.

+0

(+1) Czy kompilator jest wymagany do wysłania komunikatu diagnostycznego? 'gcc 4.7.2' nie. – NPE

+0

"Jeśli podczas parsowania nazwa w parametrze szablonu jest powiązana inaczej niż byłaby związana podczas analizy próbnej, program jest źle sformułowany. – zakinster

+0

Tak, jest oceniany podczas próby. Nie widzę żadnego wymogu zgłaszania błędu, standard mówi: "diagnostyka nie jest wymagana". –

Powiązane problemy