1

重複の可能性:
2 つの文字列リテラルを連結する

なぜこれが機能しないのですか?

const std::string exclam = "!";          
const std::string message = "Hello" + ", world" + exclam;

しかし、これはうまくいきます

const std::string exclam = "!";       
const std::string message = exclam +
"Hello" + ", world" ;     

私に説明してください。

ありがとう

4

5 に答える 5

5

その理由は、operator+2 つの文字列リテラルを追加する必要がなく、不要だからです。最初の例は、を削除するだけで機能し+ます。

const std::string message = "Hello"  ", world" + exclam;

プリプロセッサコンパイラのマジック*) が 2 つの隣接するリテラルを一緒に追加するためです。

2 番目の例は、文字列リテラルを追加するstd::stringがあるため機能します。operator+結果は、次のリテラルを連結できる別の文字列です。


*) 翻訳フェーズ 6 -隣接する文字列リテラル トークンが連結されます。

于 2012-06-12T21:46:07.427 に答える
3

"Hello" + ", world"には が含まれていませんがstd::string、2 つのconst char[]引数が含まれているためです。そして、その署名には operator+ はありません。std::stringそれらのいずれかを最初に変換する必要があります。

const std::string message = std::string("Hello") + ", world" + exclam;
于 2012-06-12T21:43:11.397 に答える
1

std::string には、2 番目の例で使用されている + 演算子があります。const char * には、最初の例で使用されているその演算子がありません。

于 2012-06-12T21:42:26.450 に答える
0

「最後に追加するとconst文字列が機能しない」は赤いニシンです。これも機能しません:

const std::string message = "Hello" + ", world";

これが機能しない理由は、他の回答で説明されています。

于 2012-06-12T21:49:35.330 に答える
0

それは結合性にかかっています。

2 番目のケースは (左から) 評価を開始し、std::stringと連結されoperator+ます。最初のケースは で始まり、const char *その連結operator+は存在しません。

于 2012-06-12T21:45:59.507 に答える