2012-02-21 2 views
0

Iは行 - > foobarに(文字列( "テキスト")+ anotherString)

foobar(string("text")+anotherString); 

foobarには、A期待文字列に文字列を変換すると思われるコードの行を有しますstd :: stringを引数として使用

このようにして変換が行われたことはありません... "text"ではどの関数が呼び出されていますか?それともキャストのトリッキーな方法ですか?

+1

を助けている場合、「foobarには、引数としてのstd ::文字列を期待」した場合、これは削除し、そのタグ:-) Cの質問ではありません

string temp("text"); temp += anotherString; foobar(temp); 

。 – paxdiablo

答えて

4

std::stringは、私が前に見てきた確信している(nullで終わると仮定)、チャーの配列を取るコンストラクタ*、しています

std::string s1 = "hello world"; 
std::string s2("also hello world"); // "same thing", essentially 

のでstd::string("test")はちょうど値"test"との一時的な文字列オブジェクトを作成します。

さらに、とconst char *の空き文字列は、文字列にchar配列のデータを追加します(ヌル終端と見なします)。

同じ効果(つまり、2つの文字列を含む一時的な文字列を連結したもの)の場合は、同等の意味でstd::string("test").append(anotherString)と書くことができます。

std::stringでサポートされている操作の一覧は、manualを参照してください。

*)またはむしろ、「文字の配列の最初の要素へのポインタ」

+0

ハハ、+1 CYAの脚注のために:-) – paxdiablo

+0

@paxdiablo:Hehe ..しかし重大な点があります:コンストラクタはテンプレートではありません* unsigned int N> string(char const(&)[N] ) 'ではなく' string(char *) 'なので、本当に配列は必要ありません。あなたが望むなら、 'string(std :: decay(" test "))'も同様に動作します。 –

+0

...準備が整ったCYAは、おそらく自由演算子+対メンバー演算子+で展開されますが、時間と場所はあります。 –

1

string("text")そのコンストラクタを呼び出し、それに"text"を通過させることによって、一時的なオブジェクトの文字列を作成します。 +anotherString部分は、一時オブジェクトの "operator +"メンバ関数を呼び出します。このメンバ関数は、文字列オブジェクトも返します。 最後に、foobarが呼び出され、この後者の文字列オブジェクトが渡されます。

それは全く同じである:これは

関連する問題