2016-05-13 9 views
0

Ich dachte alle Typen wurden signiert, wenn nicht anders angegeben (wie int). Ich war überrascht, dass es für char zu finden ist eigentlich die Implementierung definiert:Hat die Implementierungsdefinition von char Auswirkungen auf std :: string?

... Es ist die Implementierung definiert, ob ein char Objekt negative Werte halten kann. In einer bestimmten Implementierung kann ein einfaches Objekt entweder die gleichen Werte wie ein signed char oder ein unsigned char; ; welches ist implementierungsdefiniert.

Allerdings ist std::string wirklich nur std::basic_string<char, ...>.

Kann die Semantik dieses Programms von der Implementierung abweichen?

#include <string> 

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

Ja, es beeinflusst die Semantik von 'std :: sring'. – SergeyA

+0

Könnten Sie genauer sagen, was Sie meinen, wenn sich die Semantik ändert? – juanchopanza

+0

Können Sie konkret sein? @SergeyA – user6331143

Antwort

2

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.

Verwandte Themen