2012-03-13 19 views

Odpowiedz

22

nr

§14.1 [temp.param] p5

[...] najwyższego poziomu CV-kwalifikacyjne na szablonach parametrusą ignorowane przy ustalaniu jego typ.

+0

Czy jest to tylko typ parametru "typename"? (Zobacz moją odpowiedź). Nie mam dostępu do standardu i raczej nie znajduję przydatnych informacji w projekcie, który mam. –

+2

@ J.N .: Nie, ten cytat odnosi się konkretnie do parametrów szablonu non-type (w żadnym razie nie możesz mieć nazwy "const nazwa_pliku": P). – Xeo

+1

+1 za uzyskanie więcej głosów niż zaakceptowana odpowiedź. – ApprenticeHacker

5

Znalazłem to robi szybkie wyszukiwanie normy:

template<const short cs> class B { }; 
template<short s> void g(B<s>); 
void k2() { 
    B<1> b; 
    g(b); // OK: cv-qualifiers are ignored on template parameter types 
} 

Komentarz mówi, że są ignorowane.

Nie zalecam używania const w parametrach szablonu, ponieważ jest to niepotrzebne. Zauważ, że nie jest to również "dorozumiane" - są to wyrażenia stałe, które różnią się od const.

+0

Komentarze nie są normatywne. –

2

Wybór int był chyba zły pomysł, to robi różnicę dla wskaźników choć:

class A 
{ 
public: 
    int Counter; 
}; 

A a; 


template <A* a> 
struct Coin 
{ 
    static void DoStuff() 
    { 
     ++a->Counter; // won't compile if using const A* !! 
    } 
}; 

Coin<&a>::DoStuff(); 
cout << a.Counter << endl; 
+0

Wygląda na to, że standard wydaje się nie zgadzać z moim kompilatorem (GCC 4.6.1/ubuntu), jeśli wierzę w odpowiedzi innych osób:/ –

+0

Bez obaw, równie dobrze mogę błędnie interpretować standard. Odpowiedź @ Pubby wskazuje tylko, że jest ignorowana podczas dopasowywania szablonów. – Xeo

+6

'const A *' nie jest wersją '' A * '' const'. Jest to niepowiązany typ. 'A * const' jest wersją' 'A *' '' const'. –

Powiązane problemy