NB: Ich bin mir sicher, dass jemand das als subjektiv bezeichnen wird, aber ich denke, es ist ziemlich greifbar.
C ++ 11 gibt uns neue basic_string
types std::u16string
und std::u32string
, geben Sie Aliase für std::basic_string<char16_t>
bzw. std::basic_string<char32_t>
ein.
Die Verwendung der Teilstrings "u16"
und "u32"
bedeutet für mich in diesem Zusammenhang eher "UTF-16" und "UTF-32", was albern wäre, da C ++ natürlich kein Konzept für Textcodierungen hat / p>
Die Namen spiegeln tatsächlich die Zeichentypen char16_t
und char32_t
wider, aber diese scheinen falsch benannt zu sein. Sie sind aufgrund der Unsignatur ihrer zugrunde liegenden Typen nicht signiert:
[C++11: 3.9.1/5]:
[..] Die Typenchar16_t
undchar32_t
bezeichnen unterschiedliche Typen mit der gleichen Größe, Signedness und Ausrichtung wieuint_least16_t
unduint_least32_t
bzw. [..]
Aber dann scheinen mir diese Namen gegen die Konvention zu verstoßen, dass solche vorzeichenlosen Typen Namen haben, die 'u'
beginnen, und dass die Verwendung von Zahlen wie 16
, die nicht durch Terme wie least
gekennzeichnet sind, Typen mit fester Breite anzeigen / p>
Meine Frage ist also: stelle ich mir Dinge vor, oder sind diese Namen grundsätzlich fehlerhaft?
Die Namenskonvention, auf die Sie verweisen ( uint32_t
, int_fast32_t
usw.), wird nur für typedefs und nicht für primitive Typen verwendet. Die primitiven Integer-Typen sind {signed, unsigned} {char, kurz, int, long, long long}, {im Gegensatz zu Float- oder Dezimal-Typen} ...
Zusätzlich zu diesen Integer-Typen gibt es jedoch vier eindeutige eindeutige fundamentale Typen, char
, wchar_t
, char16_t
und char32_t
, die die Typen von sind die entsprechenden Literale ''
, L''
, u''
und U''
und werden für alphanumerische Daten und ähnlich für Arrays von diesen verwendet. Diese Typen sind natürlich auch Integer-Typen, und daher haben sie bei einige der arithmetischen Integer-Typen das gleiche Layout, aber die Sprache unterscheidet sehr klar zwischen den früheren, arithmetischen Typen (was Sie tun würden Verwendung für Berechnungen) und die letzteren "Zeichen" -Typen, die die Grundeinheit eines Typs von E / A-Daten bilden.
(Ich habe schon vorher über diese neuen Typen hier geredet und hier .)
Also, ich denke, dass char16_t
und char32_t
tatsächlich sehr passend benannt sind, um die Tatsache widerzuspiegeln, dass sie zu der "char" -Familie von Integer-Typen gehören.
Sind diese Namen grundsätzlich fehlerhaft?
(Ich denke, das meiste dieser Frage wurde in den Kommentaren beantwortet, aber um eine Antwort zu geben) Nein, überhaupt nicht. char16_t
und char32_t
wurden für einen bestimmten Zweck erstellt. Unterstützung des Datentyps für alle Unicode-Codierungsformate (UTF-8 wird von char
abgedeckt), wobei sie so allgemein wie möglich gehalten werden, um sie nicht nur auf Unicode zu beschränken. Ob sie nicht signiert sind oder eine feste Breite haben, hängt nicht direkt mit dem zusammen, was sie sind: Zeichendatentypen . Typen, die Zeichen enthalten und darstellen. Signedness ist eine Eigenschaft von Datentypen, die Zahlen nicht Zeichen darstellen. Die Typen sind zum Speichern von Zeichen vorgesehen, entweder 16-Bit- oder 32-Bit-basierte Zeichendaten, nicht mehr oder weniger.
Sie sind nicht grundsätzlich fehlerhaft, sie sind Teil des Standards. Wenn das Ihre Gefühle verletzt, dann müssen Sie einen Weg finden, damit umzugehen. Die Zeit, um dieses Argument zu machen, war bevor der letzte Standard ratifiziert wurde, und diese Zeit ist längst vergangen.
Tags und Links c++ c++11 language-lawyer