2009-08-11 13 views

Odpowiedz

13

Odpowiedź na pytanie tytułowe brzmi: tak. Jest różnica. Nie można przekazać funkcji std::map<int, int> do funkcji, która zajmuje std::map<const int, int>.

Jednak funkcjonalne zachowanie map jest identyczne, mimo że są to różne typy. Nie jest to niezwykłe. W wielu kontekstach int i long zachowują się tak samo, mimo że są formalnie różnymi typami.

+2

Pierwsza odpowiedź, która faktycznie odpowiada na pytanie. –

1

ponieważ int jest kopiowane przez wartość ta deklaracja const nie ma sensu. Z drugiej strony

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

dramatycznie zmienia obraz

+1

Twój przykład nie zajmuje się pytaniem: const char * jest niestałym wskaźnikiem do stałego znaku, podczas gdy pytanie dotyczy tworzenia stałej typu (czyli stałego wskaźnika do niestałego znaku): std: : map

+0

Punkt wpisu o sensie użycia kopia semantyczna, "const char *" skopiowana przez wartość, umożliwia iterację na klucz, ale dezaktywuje modyfikację klucza. Twoja deklaracja to rodzaj niedogodności. - wyłącza iterację klucza, ale umożliwia modyfikację: char * const v = "qwe"; * v = '6'; // dozwolone !!! /* ale ten błąd kompilatora przyczyna: v ++; */ char * const v - tylko – Dewfy

0

Jak powiedział Dewfy, na przykładzie dałeś, to nie ma znaczenia, ponieważ int jest wbudowany w typie i zostanie skopiowane przez wartość, ale z char * to trochę inaczej ...

Jeśli miał

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

Wtedy nie można wstawić zmienne zadeklarowane jako const char * zawiedzie

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 

z

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

rzeczywiście można powiedzieć

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' 

z

std::map<const char *, int> 

będziesz ograniczony do korzystania

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

Zobacz komentarz do Dewfy: const char * jest non-stały wskaźnik do stałej char. Nie czynisz tego typu stałym, lecz zmieniasz całkowicie typ (wskazuje na inny typ). –

1

std::map tak czy inaczej określa swój typ klucza: std::map<int, int>::value_type to std::pair<const int, int>. Jeśli dodasz const do typu klucza, po prostu zwiniesz pod numer const int.

Powiązane problemy