データ構造を定義しました
std::map<std::string, int> a;
次のように、 const char* をキーとして渡すことができることがわかりました。
a["abc"] = 1;
const char* から std::string への自動型変換を提供する関数はどれですか?
データ構造を定義しました
std::map<std::string, int> a;
次のように、 const char* をキーとして渡すことができることがわかりました。
a["abc"] = 1;
const char* から std::string への自動型変換を提供する関数はどれですか?
std::string
からの暗黙的な変換を可能にconst char*
するコンストラクタがあります。
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
のような暗黙の変換を意味します。
std::string s = "Hello";
許可されています。
次のようなことをするのと同じです
struct Foo
{
Foo() {}
Foo(int) {} // implicit converting constructor.
};
Foo f1 = 42;
Foo f2;
f2 = 33 + 9;
暗黙的な変換の構築を許可しない場合は、コンストラクターを次のようにマークしますexplicit
。
struct Foo
{
explicit Foo(int) {}
};
Foo f = 33+9; // error
Foo f(33+9); // OK
f = Foo(33+9); // OK
const char* をパラメーターとして受け取る std::string のコンストラクターがあります。
string::string(const char*);
コンストラクターが明示的に宣言されていない限り、関数を呼び出す必要がある場合、コンパイラーは 1 つの使用定義変換を適用します。
文字列コンストラクターを参照してください。コンストラクターは、マップ内のキーの変換を提供します。と同等です
a[std::string("abc")] = 1;
C++ では、パラメーターを 1 つだけ取るクラス コンストラクターを作成すると、( で別の方法で指定しない限りexplicit
)、そのパラメーターの型は暗黙的にクラスに変換可能になります。
std::string
そのようなコンストラクタがありますchar *
はい、これにより予期しない動作が発生する場合があります。explicit
これが、これらのサイレント変換が本当に必要でない限り、通常、単一パラメーターのコンストラクターを配置する必要がある理由です。