7

データ構造を定義しました

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

次のように、 const char* をキーとして渡すことができることがわかりました。

a["abc"] = 1;

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

4

4 に答える 4

16

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
于 2012-12-05T14:54:19.737 に答える
4

const char* をパラメーターとして受け取る std::string のコンストラクターがあります。

string::string(const char*);

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

于 2012-12-05T14:55:20.910 に答える
3

文字列コンストラクターを参照してください。コンストラクターは、マップ内のキーの変換を提供します。と同等です

a[std::string("abc")] = 1;
于 2012-12-05T14:56:01.663 に答える
2

C++ では、パラメーターを 1 つだけ取るクラス コンストラクターを作成すると、( で別の方法で指定しない限りexplicit)、そのパラメーターの型は暗黙的にクラスに変換可能になります。

std::stringそのようなコンストラクタがありますchar *

はい、これにより予期しない動作が発生する場合があります。explicitこれが、これらのサイレント変換が本当に必要でない限り、通常、単一パラメーターのコンストラクターを配置する必要がある理由です。

于 2012-12-05T14:59:42.427 に答える