2016-05-13 55 views
0

我認爲所有類型都有簽名,除非另有說明(如int)。我很驚訝地發現,對於char它實際上是實現定義:char的實現定義是否影響std :: string?

...這是實現定義一個char對象是否能夠維持 負值。 ...在任何特定實現中,對象可以採用與signed charunsigned char相同的值;哪一個是實現定義的。

然而std::string實際上只是std::basic_string<char, ...>

該程序的語義是否可以從實現中更改?

#include <string> 

int main() 
{ 
    char c = -1; 
    std::string s{1, c}; 
} 
+0

是的,它會影響'std :: sring'的語義。 – SergeyA

+0

你能更具體地說明你的意思是由語義變化嗎? – juanchopanza

+0

你能具體嗎? @SergeyA – user6331143

回答

2

是的,沒有。

由於std::string包含類型爲char的對象,因此類型char的簽名可能會影響其行爲。

程序在你的問題:

#include <string> 

int main() 
{ 
    char c = -1; 
    std::string s{1, c}; 
} 

是不可見的行爲(除非終止而不產生任何輸出是「行爲」),因此其行爲不依賴於平原char的符號性。編譯器可以合理優化整個main。 (我承認挑剔這裏,評論你選擇,而不是你問問題的代碼示例。)

但這個方案:

#include <iostream> 
#include <string> 

int main() { 
    std::string s = "xx"; 
    s[0] = -1; 
    s[1] = +1; 
    std::cout << "Plain char is " << (s[0] < s[1] ? "signed" : "unsigned") << "\n"; 
} 

將正確打印或者Plain char is signedPlain char is unsigned

注意,類似的程序,比較使用兩個std::string對象類型的operator<沒有區分,好像他們是無符號,類似的方式C'S memcmp作品平原char是否帶有符號,因爲<對待的字符。

但這99%的時間應該不重要。你幾乎可以肯定不得不自己寫代碼,其行爲取決於char的簽名。您應該記住它是實現定義的,但是如果簽名很重要,則應該明確使用signed char或(更可能)unsigned charchar是一種數字類型,但您應該使用它來保存字符數據。

相關問題