2009-08-11 20 views

Respuesta

13

La respuesta a su pregunta del título es sí. Hay una diferencia. No puede pasar un std::map<int, int> a una función que toma un std::map<const int, int>.

Sin embargo, el comportamiento funcional de los mapas es idéntico, a pesar de que son tipos diferentes. Esto no es inusual En muchos contextos, int y long se comportan igual, a pesar de que son tipos formalmente diferentes.

+2

La primera respuesta que realmente responde a la pregunta. –

1

since int se copia por valor esta declaración de const no tiene sentido. Por otra parte

std::map<const char*, int> map2; 

cambia drásticamente una imagen

+1

Su ejemplo no trata la pregunta: const char * es un puntero no constante a un carácter constante, mientras que la pregunta trata de hacer el tipo constante (por lo tanto un puntero constante a un carácter no constante): std: : map

+0

Punto de publicación sobre el sentido de uso de la copia semántica, "const char *" copiado por valor, permite la iteración sobre la tecla, pero deshabilita la modificación de la clave. tu declaración es una especie de inconveniente. - Deshabilita la iteración sobre la tecla, pero permite la modificación: char * const v = "qwe"; * v = '6'; // permitido !!! /* pero esta causa de error del compilador: v ++; */ const char * v - sólo – Dewfy

0

Como dijo Dewfy, con el ejemplo que diste, no importa desde un int se construyó en tipo y será copiado por valor, pero con char * es un poco diferente ...

Si tuviera

std::map<char *, int> map; 

Entonces no se puede insertar una variable declarada como const char * fallará

char * y = new char[4]; 
const char * x = "asdf"; 
std::map<char *, int> map; 
map.insert(make_pair(y, 4)); //ok 
map.insert(make_pair(x, 4)); //fail 

con un

std::map<char*, int> map; 

en realidad se puede decir

char * x = new char[1]; 
(*x) = 'a'; 
map<char*,int>::iterator it = map.begin(); 
cout<<it->first; //prints 'a' 
(it->first)[0] = 'x' 
cout<<it->first; //prints 'x' 

con un

std::map<const char *, int> 

se le restringido a usar

map<const char*, int>::iterator 
+2

Véase el comentario a Dewfy: const char * es un puntero no constante a un char constante. No hace que el tipo sea constante, sino que cambia por completo el tipo (para apuntar a un tipo diferente) –

1

std::map confunde su tipo de clave de todos modos: std::map<int, int>::value_type es std::pair<const int, int>. Si agrega un const al tipo de clave, const const int colapsará simplemente al const int.

Cuestiones relacionadas