2017-01-21 28 views
0

は、私が機能を持っていると言う:文字列演算子は::文字列

void foo(const std::string& str); 

私はその機能を呼び出すことができます。

foo("my string"); 

どうstd::stringはタイプの代わりに文字列を受け入れていますか?それは過負荷演算子ですか?私は自分の文字列クラスを作っていますが、この機能は必須です。コール

foo("my string"); 

コンパイラを考える

+0

'のstd :: STRING'は'のconstのchar * 'をとる非明示的なコンストラクタを持っています。 – DeiDei

答えて

2

はに解決すべき機能の呼び出しを決定するために様々なステップを経る必要があります。

  1. fooのすべての機能を特定の範囲で確認してください。
  2. fooという名前の関数が複数ある場合、指定された引数で呼び出すことができる実行可能な関数をすべて見つけようとします。複数のマッチがある場合は、引数を指定して最適なマッチを見つけようとします。実行可能な関数が1つしかない場合、コンパイラは処理を進めます。実行可能な機能がない場合、コンパイルエラーが発生します。
  3. fooという名前の関数が1つしかない場合、関数を呼び出すために使用された引数が引数の型と一致するかどうかを確認しようとします。 yesの場合、コンパイラは処理を続けます。そうでない場合は、コンパイラエラーが発生します。

引数が関数の引数型と一致するかどうかを判断するロジックは、ここで説明するには長すぎます。詳しくはhttp://en.cppreference.com/w/cpp/language/overload_resolutionhttp://en.cppreference.com/w/cpp/language/implicit_conversionで読むことができます。

std::stringのコンストラクタを使用すると、"my string"std::stringに変換できます。コール

foo("my string"); 

は同等です:

foo(std::string("my string")); 
+0

それで、私が正しく理解すれば、それはすべてコンパイラに任されますか? –

+1

@OliverYasunaしかし、コンパイラは、標準が定めたものに従わなければなりません。 –

+0

ダーンなので、これを行う独自の文字列クラスを作成することはできません。ありがとうございます –

関連する問題