2012-02-08 65 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!");,它也不起作用。

爲什麼我不能使用二元運算符+=以這種方式連接字符串?

+5

告訴我們錯誤信息,或者它沒有發生。 – 2012-02-08 23:57:20

+2

這對某些現有答案是隱含的,但值得一提的是,C++優先規則意味着「+」there!「'在s + ='操作之前被評估,所以你也嘗試過的括號沒有被'沒有任何區別。有趣的是,'s + =「」「there!」'會起作用 - 相鄰字符串的連接是在編譯的早期階段完成的,而's = s +「」+「there!」'也可以作爲s +「」'首先被評估,然後它的'std :: string'結果有「there!」添加 - 當'+'的任一參數是一個'std :: string'時它工作得很好...... – 2012-02-09 00:38:17

+0

+1謝謝Tony提供這些細節! – 2012-02-09 00:47:20

回答

9

問題是你試圖「添加」兩個文字字符串。文字字符串在C++中不是std :: string類型,它們就像不可變的字符數組。將兩個加在一起並不合理,因爲它將像添加兩個指針一樣。

你可以,但是,這樣做:

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

這是因爲在C++中定義來連接C++字符串使用C字符串的方法。

+0

「s = s +」「+」在那裏!「;」工作,然後呢?是「s +」「」執行,導致std :: string,然後「+」那裏「」部分完成,再次針對std :: string? a + = b和a = a + b之間的技術差異是什麼? – 2014-12-16 13:11:43

+0

's +「there」'因爲'string + const char *'有一個重載操作符。在C++中'a + = b'和'a = a + b'通常沒有什麼區別,但是一個庫實現者如果他們是邪惡的話可能會有所不同。 – 2014-12-17 00:07:01

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; 
}