2012-12-05 15 views
7

私は同じように、私はキーとして* constの文字を渡すことができたは、なぜ私がのstd ::マップ内のキーとして* constの文字を使用することができます。<はstd ::文字列、整数>

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

データ構造を定義していthis:

a["abc"] = 1; 

const char *からstd :: stringへの自動型変換を提供する関数はどれですか?

+1

このようなことは暗黙のうちにバグを見つけにくいレシピのように聞こえます。 –

+1

ナー、いくつかの暗黙的な変換は問題ありません。 C文字列と 'std :: string'は意味的に同等ですが、C文字列は役に立たないものです。 – Puppy

+0

@Warren、これはC++では一般的です。特に、std :: stringのようなよく使われる構造体の場合はそうです。あなたは一時的なstdのパフォーマンスヒットを楽しむことができます::あなたがルックアップを行うたびに文字列の構築... – Alex

答えて

15

std::stringは、constructor that allows the implicit conversion from const char*を有する。

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

は、

std::string s = "Hello"; 

などの暗黙的な変換が許可されていることを意味します。

それはあなたが暗黙の型変換の建設を禁止したい場合、あなたはexplicitとしてコンストラクタをマーク

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

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

のようなものをやってするのと同じです:

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

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

STDのコンストラクタがあります: :const char *をパラメータとする文字列。

string::string(const char*); 

コンストラクタが明示的に宣言されない限り、コンパイラは、関数を呼び出すために必要な場合には、定義済みの変換を適用します。

3

string constructorを参照してください。コンストラクタは、マップ内のキーの変換を提供します。それはあなたが(あなたがexplicitとそうでないことを教えていない限り)、次に、パラメータを1つだけ取るクラスのコンストラクタを作る場合、そのパラメータの種類は、あなたのクラスにimplicitly convertableなります

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

に相当します。

std::stringはい、これは機会に、いくつかの予期しない動作を引き起こす可能性がありますchar *

のためにこのようなコンストラクタを持っています。このため、通常、これらのサイレント変換が本当に必要な場合を除いて、単一パラメータのコンストラクタにexplicitを置く必要があります。

関連する問題