2012-12-05 18 views
7

muszę zdefiniować strukturę danychDlaczego mogę używać const char * jako klucz w std :: map <std :: string, int>

std::map<std::string, int> a; 

znalazłem mogę przekazać const char * jako klucza, jak to:

a["abc"] = 1; 

Która funkcja zapewnia automatyczną konwersję z typu const char * aby std :: string?

+1

Robienie takich rzeczy niejawnie brzmi jak przepis na trudne do znalezienia błędy. –

+1

Nie, niektóre niejawne konwersje są w porządku. C-string i 'std :: string' są semantycznie równoważne, po prostu ciąg C jest bezużytecznym kawałkiem bzdur. – Puppy

+0

@Warren, jest to powszechne w C++, szczególnie w przypadku powszechnie używanych konstrukcji, takich jak std :: string. Możesz cieszyć się hitem wydajności tymczasowej konstrukcji std :: string za każdym razem, gdy robisz odnośnik ... – Alex

Odpowiedz

15

std::string ma constructor that allows the implicit conversion from const char*.

basic_string(const CharT* s, 
       const Allocator& alloc = Allocator()); 

oznacza, że ​​domniemany konwersji, takich jak

std::string s = "Hello"; 

jest dozwolone.

Jest odpowiednikiem robi coś podobnego

struct Foo 
{ 
    Foo() {} 
    Foo(int) {} // implicit converting constructor. 
}; 

Foo f1 = 42; 
Foo f2; 
f2 = 33 + 9; 

Jeśli chciał zabronić niejawny budowę konwersji oznaczyć konstruktora jako explicit:

struct Foo 
{ 
    explicit Foo(int) {} 
}; 

Foo f = 33+9; // error 
Foo f(33+9); // OK 
f = Foo(33+9); // OK 
4

istnieje konstruktor std : ciąg, który przyjmuje const char * jako parametr.

string::string(const char*); 

Jeżeli konstruktor jest zadeklarowana wyraźny następnie kompilator będzie zastosować jeden Zastosowanie określone przekształcenie w razie potrzeby zadzwonić do żadnej funkcji.

3

Zobacz string constructor. Konstruktor zapewnia konwersję klucza w mapie. Jest to równoznaczne z

a[std::string("abc")] = 1; 
2

w C++, jeśli uczynić konstruktora klasy, która trwa tylko jeden parametr, a następnie (jeśli nie powiedzieć to inaczej z explicit), typ tego parametru będzie implicitly convertable do swojej klasy.

std::string ma takiego konstruktora dla char *

Tak, może to spowodować nieoczekiwane zachowanie na okazję. Dlatego zazwyczaj powinieneś umieścić explicit na konstruktorach jednoparametrowych, chyba że naprawdę chcesz te ciche konwersje.

Powiązane problemy