5

私はちょうど関数を書いた:

void doSomeStuffWithTheString(const std::string& value) {
...
std::string v = value;
std::cout << value.c_str();
...
}

しかし、私はこれを

doSomeStuffWithTheString("foo");

そしてそれは動作します。したがって、これが機能するためには (std::string の暗黙的なインスタンスを初期化するための const char*)、値を値渡しする必要があると考えていたでしょうが、この場合は (const) 参照によって渡されます。

参照が const の場合、const char* からインスタンス化された暗黙の一時的な std::string は偶然ですか? そうでない場合、これはどのように機能するのでしょうか?

編集

関数がオーバーロードされるとどうなりますか

void doSomeStuffWithTheString(const char* value);

どちらがコンパイラを選択しますか?

4

4 に答える 4

7

このstd::string型には、からの(コンストラクターを介した)暗黙の変換がありconst char*ます。これにより、文字列リテラル"foo"をに変換できstd::stringます。これにより、一時的な値になります。C ++ではconst &、一時的な値を持つことは合法であり、したがって、これはすべて一緒になります。

C ++で独自のカスタム型を使用して、このトリックを複製することができます。

class Example {
public:
  Example(const char* pValue) {}
};

void Method(const Example& e) {
  ...
}

Method("foo");
于 2012-01-25T16:50:27.517 に答える
0

はい、一時std::stringは文字列リテラルから構築されます。

于 2012-01-25T16:49:39.403 に答える
0

「値は値によって渡される必要がありますが、この場合は (const) 参照によって渡されます。」

std::string一時的な値 (この場合、から暗黙的に変換された一時値) を const-reference (この場合は) 型const char *の引数に渡すことができる C++ 機能があります。const std::string &

于 2012-01-25T23:14:14.563 に答える
0

まさに、std::stringデフォルトのコンストラクターを使用して

于 2012-01-25T16:51:19.277 に答える