0

C++ などで 2 つの文字列リテラルを追加できない理由、および operator+ が整数への文字列リテラルの追加をサポートする理由について、私は多数の投稿を読みました。

ただし、次のコードのコンパイラ エラーを理解しようとしています。

string str1, str2, str3;
int i = 10;

str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";

との初期化は正常str1str2動作しますが、 の構築でstr3次のエラーが発生します。

example.cpp: 関数内int main():
example.cpp:20:27: エラー: 型const char*const char [5]バイナリのオペランドが無効ですoperator+

Q1: エラー メッセージで、 をconst char [5]参照していると理解しました"Mars"。に変換した後const char*の整数を参照するのは何ですか?ichar *

Q2:operator+左から右への結合性があります。 の構成は次のstr3ように記述できると推測しています。

str3 = ("Hello " + i) + "Mars";

("Hello " + i)に評価されchar *ますか?

Q3: 次のコードでは:

str5 = string("foo ") + "bar ";
str6 = string("foo ") + "bar " + i;

の設定は正常にstr5コンパイルされますが、大量str6のエラー メッセージ (ページと半分) が生成されます。の結果は何string("foo ") + "bar "ですか"string"?

洞察をお寄せいただきありがとうございます。

4

3 に答える 3

7

str1文字列リテラル (実際には定数文字の配列) を取得し、それを最初の文字へのポインターに減衰させ、そのポインターに 10 を追加するとconst char *、文字列リテラルの外側にある a になります。これは未定義の動作です。終わり。

str2は と同じことをstr1行いますが、範囲をさらに超えています。

str3and で同じことを"Hello"行い、結果を他の文字列リテラル (関数に渡されるために減衰する定数文字の配列) にi追加しようとします。andを取るconst char *オーバーロードがないため、エラーが発生します。operator+const char *const char *

これらのどれも、あなたが望むようには機能しないことに注意してください。コンパイルするものは未定義の動作です。std::string目的に合わせてオーバーロードoperator+されているため、文字列リテラルを a に追加すると、std::string単に連結されます。ただし、整数を追加することは少しあいまいです (したがって、 ではサポートされていませんoperator+)。そのため、最初に文字列に変換して意図を明確にする必要があります。

str6 = string("foo ") + "bar " + std::to_string(i);
于 2013-04-16T21:50:15.983 に答える
3

Q1: エラー メッセージで、const char [5]' が "Mars" を指しているとわかりました。const char*' は、「char *」に変換された後の整数 i を参照しますか?

の結果を指し"Hello" + iます。

Q2: operator+ には左から右への結合性があります。str3 の構造は次のように書けると推測しています。 str3 = ("Hello " + i) + "Mars";

("Hello " + i) は char * に評価されますか?

はい。しかし、それは に評価されconst char*ます。

Q3: string("foo ") + "bar " の結果は何ですか? "string" ですか?

はい、それはstd:stringです。str6 = string("foo ") + "bar " + i;文字列と整数を追加できないため、エラーが発生します。

補足 - 次の 3 つのステートメントはいずれも初期化ではありません。

str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";

それらはすべて代入演算子を呼び出します。

于 2013-04-16T21:48:52.337 に答える