2011-01-31 20 views
4

動作し、クラッシュしません。大丈夫ですか?std :: string s =(std :: string) "a" + "b" + "c"; OK?

編集理由:std::string s = "a" + "b" + "c";はコンパイラエラーを生成し、(std::string)"a"は単に "a"が "std :: string"を指していると仮定してコンパイラに通知します。実際にstd :: stringがどのように実装されているかはわかりませんでした。

皆様からのご意見ありがとうございます。

+0

あなたはstd :: string s =(std :: string)( "a" + "b" + "c")を意味すると思います。 ? – BlackBear

+0

@BlackBearそれはあなたがお互いにポインタを追加することはできないので、コンパイルさえできません。 – Timbo

+0

@BlackBear:それは失敗します。彼のコードは文字列オブジェクトに "a"をキャストして連結します。あなたは2つのポインタを追加しようとしますが、失敗するでしょう。 –

答えて

6

はい。 +は左結合型なので、((std::string)"a" + "b") + "c"に相当します。 std::string::operator+はオーバーロードされ、const char *を引数にとります。

5

はい。それはいいです。

それは

std::string s = "a"; 
s += "b"; 
s += "c"; 
+0

を除いて、Cスタイルのキャスト – ThomasMcLeod

+0

実際にあなたの解釈はトピック作成者のものよりも効果的です:あなたは1つの文字列オブジェクトを持っていて、3つの 'const string'を作成します – ssmir

+0

@ssmir: 'std :: string'は、確かに' const'ではありません。それらはコンパイラによって省略されてもよく、移動セマンティクスは確実に3つを排除する。 – GManNickG

1

std::stringを行うとほとんど同等だがタイプconst char *の右側の引数を取るメンバ関数operator +を持っています。また、オペレータの左側にconst char *を置くことを可能にするグローバルに定義されたoperator +があります。

// std::string::operator + (const char *) 
std::string a; 
a = "b"; 

// global operator + (std::string, const char *) 
std::string a; 
a = (std::string)"b" + "c"; 

// global operator + (const char *, std::string) 
std::string a; 
a = "b" + (std::string)"c"; 

文字列リテラルは、タイプconst char *であるため、引数は型キャストstd::stringにでなければならない理由。 "a" + "b"の問題は、コンパイラが代入文にタイプstd::stringのオブジェクトを持たないため、ポインタを一緒に追加しようとしていることです。これを避けるには、char *用語の左側または右側にタイプstd::stringの用語が必要です。

1

が良いだろう:

std::string s(std::string("a") + "b" + "c"); 
+1

私はそれがより良い理由は分かりません。 – GManNickG

+0

@Gman、それはもっとC++のようです。 :) – ThomasMcLeod

+0

おそらく。私はあなたのCスタイルのキャストポイントは、コピー初期化の紛失の中でもリストになっていると思います。これは読みやすくなりました。 – GManNickG

2

(std::string)"a"だけではありません、これはどのようなキャストではありません

"ちょうど"a"を指しているものを推測することはstd::stringである"、コンパイラに指示しますオブジェクト型への変換はまったく意味しません。オブジェクト型へのキャストは、変換の明示的な要求です。 (std::string)"a"リテラル(const char[]"a"から一時的std::stringを構築する。宣言std::string s = (std::string)"a" + "b" + "c";

、この一時的な生活をs完了の初期化まで」を意味する。(12.2 [class.temporary]/4)

あり最初の一時的なものにoperator+を適用した結果、およびを適用した結果、およびその結果にを適用すると、がコピー初期化されます。一時的な人は、彼らの建設の詩の順序。

初期化は有効で、正しく定義された動作をしています。

+0

ねえ、私はそれを感謝します。だから、基本的なタイプのものとは違って、それは同じであると思った。 (int) "hello"または(char *)nは、私が記述したように動作します。 – Mark

関連する問題