2012-02-08 16 views
0

内の文字列を持つ:+ =私はC++の文字列で遊んでましたし、コンパイル時に次のエラーが発生する理由を私は理解していないC++

string s = "hi"; 
s += " " + "there!"; 

エラーメッセージ:

error: invalid operands of types ‘const char [2]’ and ‘const char [6]’ to binary ‘operator+’ 

を私はまたs+= (" " + "there!");を試しても動作しません。

このように2進演算子+=を使用して文字列を連結できないのはなぜですか?

+5

は私たちに、エラーメッセージを伝える、またはそれは実現しませんでした。 –

+2

これはいくつかの既存の答えには暗黙のうちにありますが、C++の優先順位ルールは '' '+ ''の前に評価されていることに言及する価値があるので、差をつける。興味深いことに、 's + =" "there"! "'は動作します - 隣接する文字列リテラルの連結はコンパイルの初期段階で行われ、 's = s +" "+" + "" 'が最初に評価され、' std :: string'の結果に「there!」が含まれます。追加されました - '+'のいずれかの引数が 'std :: string'の場合、それはうまく動作します.... –

+0

+1これらの詳細についてはトニーに感謝します! –

答えて

9

問題は、2つのリテラル文字列を「追加」しようとしていることです。リテラル文字列はC++のstd :: string型ではなく、不変の文字配列のようなものです。 2つのポインタを一緒に追加するようなので、2つを一緒に追加することは意味をなさない。

あなたが、しかし、これを行うことができます。

std::string("foo") + "bar" 

C文字列とC++の文字列を連結するために、C++で定義されたメソッドがあるためです。

+0

どのように "s = s +" "+"そこにありますか? ";"仕事? "s +" ""が実行されてstd :: stringとなって "+"そこの部分がもう一度std :: stringに対して実行されますか? a + = bとa = a + bの技術的な違いは何ですか? –

+0

'string + const char *'にオーバーロードされた演算子があるため、 's +" there "'が動作します。通常、C++では 'a + = b'と' a = a + b'の間に違いはありませんが、ライブラリの実装者は、悪い場合には何らかの違いが生じる可能性があります。 –

9

リテラル文字列は文字列オブジェクトではなく、単なる文字配列です。そのようなものを追加しようとすると、配列へのポインタに崩壊し、ポインタのペアを追加することはできません。最初のリテラルを文字列オブジェクトに変換すると、期待どおりに動作します。

s += string(" ") + "there!"; 

また、単に+ずに隣同士にそれらを置くことによってリテラルを連結することができます。私はそれをしようとすると

s += " " "there!"; 
1

私が取得:

私に語っ
632 $ g++ foo.C 
foo.C: In function ‘int main()’: 
foo.C:5:16: error: invalid operands of types ‘const char [2]’ and ‘const char [7]’ to binary ‘operator+’ 

「」定数文字の配列ではない文字列です。

これは動作します:

636 $ cat foo.C 
#include <string> 
using std::string; 
int main(void){ 
    string s = "hi"; 
    s += string(" ") + string("there!"); 
    return 0; 
} 
関連する問題