2012-03-13 11 views

Respuesta

22

No.

§14.1 [temp.param] p5

[...] el nivel superior CV-calificadores en la plantilla-parámetro se ignoran cuando se determina su tipo.

+0

¿Es solo para el parámetro 'typename' kind kind? (Ver mi respuesta). No tengo acceso al estándar y soy bastante malo al encontrar información útil en el borrador que tengo. –

+2

@ J.N .: No, esta cita se refiere específicamente a los parámetros de plantilla sin tipo (de todos modos no se puede tener 'const typename': P). – Xeo

+1

+1 para obtener más votos que la respuesta aceptada. – ApprenticeHacker

5

Me encontraron esta haciendo una búsqueda rápida del estándar:

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 
} 

El comentario dice que son ignorados.

Recomendaré no usar const en los parámetros de la plantilla, ya que no es necesario. Tenga en cuenta que tampoco está 'implícito' - son expresiones constantes que son diferentes de const.

+0

Los comentarios no son normativos. –

2

La elección de int era probablemente una mala idea, se hace una diferencia para los punteros sin embargo:

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

Curiosamente, el estándar parece estar en desacuerdo con mi compilador (GCC 4.6.1/ubuntu) si voy a creer las respuestas de otras personas:/ –

+0

No me preocupo, también puedo estar malinterpretando el estándar. Y la respuesta de @ Pubby solo indica que se ignora al hacer coincidir las plantillas. – Xeo

+6

'const A *' no es la versión 'const' de' A * '. Es un tipo no relacionado. 'A * const' es la versión' const' de 'A *'. –

Cuestiones relacionadas