Sind 'char16_t' und 'char32_t' falsch?

9

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 Typen char16_t und char32_t bezeichnen unterschiedliche Typen mit der gleichen Größe, Signedness und Ausrichtung wie uint_least16_t und uint_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?

    
Lightness Races in Orbit 08.10.2012, 20:58
quelle

3 Antworten

11

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.

    
Kerrek SB 09.10.2012, 10:54
quelle
4
  

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.

    
Jesse Good 09.10.2012 02:42
quelle
-3

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.

    
Mark Ransom 09.10.2012 02:24
quelle

Tags und Links