私は同じように、私はキーとして* constの文字を渡すことができたは、なぜ私がのstd ::マップ内のキーとして* constの文字を使用することができます。<はstd ::文字列、整数>
std::map<std::string, int> a;
データ構造を定義していthis:
a["abc"] = 1;
const char *からstd :: stringへの自動型変換を提供する関数はどれですか?
私は同じように、私はキーとして* constの文字を渡すことができたは、なぜ私がのstd ::マップ内のキーとして* constの文字を使用することができます。<はstd ::文字列、整数>
std::map<std::string, int> a;
データ構造を定義していthis:
a["abc"] = 1;
const char *からstd :: stringへの自動型変換を提供する関数はどれですか?
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
STDのコンストラクタがあります: :const char *をパラメータとする文字列。
string::string(const char*);
コンストラクタが明示的に宣言されない限り、コンパイラは、関数を呼び出すために必要な場合には、定義済みの変換を適用します。
string constructorを参照してください。コンストラクタは、マップ内のキーの変換を提供します。それはあなたが(あなたがexplicit
とそうでないことを教えていない限り)、次に、パラメータを1つだけ取るクラスのコンストラクタを作る場合、そのパラメータの種類は、あなたのクラスにimplicitly convertableなります
a[std::string("abc")] = 1;
に相当します。
std::string
はい、これは機会に、いくつかの予期しない動作を引き起こす可能性がありますchar *
のためにこのようなコンストラクタを持っています。このため、通常、これらのサイレント変換が本当に必要な場合を除いて、単一パラメータのコンストラクタにexplicit
を置く必要があります。
このようなことは暗黙のうちにバグを見つけにくいレシピのように聞こえます。 –
ナー、いくつかの暗黙的な変換は問題ありません。 C文字列と 'std :: string'は意味的に同等ですが、C文字列は役に立たないものです。 – Puppy
@Warren、これはC++では一般的です。特に、std :: stringのようなよく使われる構造体の場合はそうです。あなたは一時的なstdのパフォーマンスヒットを楽しむことができます::あなたがルックアップを行うたびに文字列の構築... – Alex