是的,沒有。
由於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 signed
或Plain char is unsigned
。
注意,類似的程序,比較使用兩個std::string
對象類型的operator<
沒有不區分,好像他們是無符號,類似的方式C'S memcmp
作品平原char
是否帶有符號,因爲<
對待的字符。
但這99%的時間應該不重要。你幾乎可以肯定不得不自己寫代碼,其行爲取決於char
的簽名。您應該記住它是實現定義的,但是如果簽名很重要,則應該明確使用signed char
或(更可能)unsigned char
。 char
是一種數字類型,但您應該使用它來保存字符數據。
是的,它會影響'std :: sring'的語義。 – SergeyA
你能更具體地說明你的意思是由語義變化嗎? – juanchopanza
你能具體嗎? @SergeyA – user6331143