Ja und nein.
Da ein std::string
Objekte vom Typ char
enthält, kann die Signedness des Typs char
sein Verhalten beeinflussen.
Das Programm in Ihrer Frage:
#include <string>
int main()
{
char c = -1;
std::string s{1, c};
}
hat kein sichtbares Verhalten (es sei denn, endet ohne jegliche Ausgabe zu produzieren „Verhalten“ ist), so dass ihr Verhalten auf der Signedness Normal char
nicht ab. Ein Compiler könnte sinnvollerweise den gesamten Körper von main
optimieren. (Ich bin zwar hier pingelig, kommentiert die Codebeispiel Sie ausgewählt, anstatt die Frage Sie fragen.)
Aber dieses Programm:
#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";
}
wird richtig gedruckt entweder Plain char is signed
oder Plain char is unsigned
.
Beachten Sie, dass ein ähnliches Programm, das diese Art der Verwendung von zwei std::string
Objekte vergleicht operator<
nicht nicht unterscheiden, ob schlicht char
signiert oder unsigniert, da <
behandelt die Zeichen, als ob sie ohne Vorzeichen waren, ähnlich wie memcmp
Werke C.
Aber das sollte in 99% der Zeit keine Rolle spielen. Sie müssen fast aus dem Weg gehen, um Code zu schreiben, dessen Verhalten von der Signiertheit von char
abhängt. Sie sollten daran denken, dass es implementiert ist, aber wenn die Signedness wichtig ist, sollten Sie signed char
oder (wahrscheinlicher) unsigned char
explizit verwenden. char
ist ein numerischer Typ, aber Sie sollten ihn verwenden, um Zeichendaten zu speichern.
Ja, es beeinflusst die Semantik von 'std :: sring'. – SergeyA
Könnten Sie genauer sagen, was Sie meinen, wenn sich die Semantik ändert? – juanchopanza
Können Sie konkret sein? @SergeyA – user6331143