FAQ-Eintrag auf C++11 aktualisieren: "Taxonomie für Typen (fundamental, POD, UDT, ...)"
-
Unabhängig davon, dass die FAQ hier ein Witz ist: Der einzige sinnvolle Beitrag Kleine Taxonomie für Typen (fundamental, POD, UDT, ...) müsste mal auf C++11 aktualisiert werden, da der Begriff POD durch andere (Standard-Layout und Trivial) ersetzt worden ist.
-
Oh, es steht dir frei, die FAQ so zu gestalten, dass du sie für sinnvoll halten kannst. Du darfst mitgestalten.
-
poddi schrieb:
Unabhängig davon, dass die FAQ hier ein Witz ist: Der einzige sinnvolle Beitrag Kleine Taxonomie für Typen (fundamental, POD, UDT, ...) müsste mal auf C++11 aktualisiert werden, da der Begriff POD durch andere (Standard-Layout und Trivial) ersetzt worden ist.
Tja, ist doch ganz einfach: Setz´ dich hin, schreib´ eine neue, aktuelle FAQ und setz´ dich mit ´nem Moderator in Verbindung, damit er sie einpflegen kann.
-
Ich glaub, auf einmal sit die FAQ gut genug
-
schaut doch eh keiner rein
-
Skym0sh0 schrieb:
Ich glaub, auf einmal sit die FAQ gut genug
Nö, bei der FAQ ist schon alles verloren. Sie ist TL;DR, schlecht aufgebaut und veraltet.
Das einzige, das helfen würde, ist sie vollständig zu löschen und neue und gut durchdachte Beiträge hinzuzufügen.
Davon abgesehen ist das nicht meine FAQDen besagten Beitrag selber zu korrigieren trau ich mir nicht zu.
-
Genau das sage ich ja
-
2. Entwurf
- bedeutet, dass genau ein Punkt der Aufzählung ist für den jeweiligen Typ zutreffend ist x bedeutet, dass alle Punkte der Aufzählung für den jeweiligen Typen zutreffen Alle Typen - Fundamentale Typen (fundamental types 3.9.1) - arithmetische Typen (arithmetic types 3.9.1/8) - integrale Typen (integral types / integer types 3.9.1/7) - vorzeichenbehaftete integrale Typen (signed integer types 3.9.1/2) - vorzeichenbehaftet integrale Standardtypen (standard signed integer types 3.9.1/2) - signed char - short - int - long - long long - erweiterte vorzeichenbehaftete Integer (extended signed integer types 3.9.1/2) - optional (implementation-defined) - vorzeichenlose integrale Typen (unsigned integral types 3.9.1/3) - vorzeichenlose integrale Standardtypen (standard unsigned integer types 3.9.1/3) - unsigned char - unsigned short - unsigned - unsigned long - unsigned long long - erweiterte vorzeichenbehaftete Integer (extended unsigned integer types 3.9.1/3) - optional (implementation-defined) - andere - bool: ist vorzeichenlos, gehört aber nicht zu dieser Kategorie und braucht ein paar Sonderregeln (3.9.1/6) - char: verhält sich implementationsabhängig entweder wie signed char oder unsigned char (3.9.1/1) - wchar_t: verhält sich implementationsabhängig wie ein bestimmter vorzeichenloser oder vorzeichenbehafteter integraler Typ (3.9.1/5) - char16_t: eigenständiger Typ, äquivalent zu std::uint_least16_t (3.9.1/5) - char32_t: eigenständiger Typ, äquivalent zu std::uint_least32_t (3.9.1/5) - Gleitkommatypen (floating point types 3.9.1/8) - float - double - long double - void (3.9.1/9) - std::nullptr_t (3.9.1/10) - Zusammengesetzte Typen (compound types 3.9.2) - Arrays (arrays) - Funktionen (functions) - Zeiger (pointer) - Objektzeiger (object pointer types 3.9.2/3) - Zeiger auf Objekte (pointer to object types) - Zeiger auf void (pointer to void) - Funktionszeiger (function pointer types 3.9.2/3) - Referenzen auf Objekte oder Funktionen (references) - lvalue-Referenzen (lvalue references) - rvalue-Referenzen (rvalue references) - Klassen (classes) - union - Strukturen (structs) - struct - class - Aufzählungen (enumerations) (s.u.) - Zeiger auf nicht-statische Member (pointer to (non-static) member) Zeichentypen (character types) - char - signed char - unsigned char Objekttypen (object types 3.9/8) - alle außer void, Referenzen, Funktionen Skalare Typen (scalar types): alle Objekttypen, die keine Komponenten haben - arithmetische Typen - Zeiger - Zeiger auf Member - Aufzählungen - std::nullptr_t Aufzählungen - unscoped enumerations ([i]enum-key[/i] = enum) - Aufzählungskonstanten werden im gleichen Scope wie die Aufzählung selbst plaziert - scoped enumerations ([i]enum-key[/i] = enum class / enum struct) - Aufzählung bildet einen eigenen Scope, in dem sich die Aufzählungskonstanten befinden, keine implizite Konvertierung in integer Aufzählungstypen haben einen zugrundeliegenden integralen Typen (underlying type), der für die Repräsentation verwendet werden kann. Dieser kann explizit angegeben werden (enum-base), wird er nicht angegeben, so ist er int im Falle von scoped Aufzählungen. In diesen Fällen ist der zugrundeliegende Typ fest (fixed). Im Falle von unscoped Aufzählungen ohne Angabe ist der Typ unspezifiziert mit bestimmten Einschränkungen (Details in 7.2/6), in der Praxis typischerweise int oder - soweit erforderlich - ein größerer Typ. Aggregate (aggregates) - Arrays - Klassen x ohne vom Nutzer deklarierte Konstruktoren x ohne nicht-statische protected oder private Datenmember x ohne Basisklassen x ohne virtuelle Funktionen x ohne Initialisierer für nichtstatische Member POD (plain old data) - rekursive Definition: - Skalare Typen - POD-Klasse x Klassen-Aggregat x ohne vom Nutzer deklarierten Destruktor x ohne vom Nutzer deklarierten Zuweisungsoperator x ohne nichtstatische nicht-POD-Datenmember - union: POD-union - Struktur: POD-struct - Arrays aus PODs Alle POD-Typen sind trivial und haben Standard-Layout. Literaltypen (literal types) - Skalare Typen - Referenzen auf Literaltypen - Array aus Literalen - Klassen x trivialer Destruktor x alle Initialisierer für nichtstatische Member (sofern vorhanden) sind konstante Ausdrücke x Entweder - Aggregat - mindestens eine constexpr-Konstruktor, der kein Copy- oder Movekonstruktor ist x alle nichtstatischen Datenmember und Basisklassen sind Literaltypen Trivial kopierbare Typen (trivially copyable types 3.9/9) - Skalare Typen - Trivial kopierbare Klassen x kein nicht-trivialer Copy-Konstruktor* x kein nicht-trivialer Move-Konstruktor* x kein nicht-trivialer Copy-Zuweisungsoperator* x kein nicht-trivialer Move-Zuweisungsoperator* x trivialer Destruktor* - Arrays solcher Typen Triviale Typen (trivial types 3.9/9) - Skalare Typen - Triviale Klassen x trivial kopierbare Klasse x trivialer Defaultkonstruktor - Arrays solcher Typen Alle trivialen Typen sind trivial kopierbar. Standardlayout-Typen (standard-layout types) - Skalare Typen - Standardlayout Klassen x nichtstatische Daten-Member haben Standardlayout x Basisklassen haben Standardlayout x keine virtuellen Funktionen x keine virtuellen Basisklassen x gleiche Zugriffskontrolle für alle nichstatischen Datenmember x höchtens 1 Klasse in der gesamten Vererbungshierarchie definiert nichtstatische Daten-Member x 1. Daten-Member (wenn vorhanden) ist nicht gleichzeitig Basisklasse - Arrays solcher Typen UDT (user defined types) - Klassen - Aufzählungen "eingebaute Typen" (build-in types): informell - Typen, die keine UDTs sind triviale Memberfunktionen ------------------------- Eine spezielle Memberfunktion ist user-provided, wenn sie explizit deklariert wird, und diese 1. Deklaration weder explizit defaulted noch explizit deleted ist. Zur Vereinfachung im Folgenden: Eine Subobjektklasse sei eine Klasse, bei der es sich entweder um eine (direkte) Basisklasse oder den Klassentyp eines nichtstatischen Members, oder den Klassentype eines Elementes eines nichtstatischen Memberarrays handelt. Eine spezielle Memberfunktion ist trivial, wenn x sie nicht user-provided ist, x korrespondierende Memberfunktionen aller Subobjektklassen trivial sind, x im Falle des Defaultkonstruktors kein nichtstatischer Member über einen Initialisierer verfügt, x und - im Falle des Destruktors dieser nicht virtuell ist, sonst - die Klasse keine virtuellen Funktionen und keine virtuellen Basisklassen hat Korrespondierende Memberfunktionen i.o.S. sind - im Falle eines Defaultkonstruktors - die Defaultkonstruktoren der Subobjektklassen - im Falle des Destruktors - die Destruktoren der Subobjektklassen - sonst - die Memberfunktionen, die für Copy-/Move der Subobjekte ausgewählt werden (dabei handelt es sich nicht notwendigerweise um Copy-/Move-Konstruktoren oder Zuweisungsoperatoren, allerdings können nur solche trivial sein)
Bitte um Hinweise, wenn noch etwas fehlt oder näher erläutert werden müsste.
-
Vielen Dank für den Aufwand, camper!
Ich würde noch Strongly Typed Enumerations (
enum struct
/enum class
) erwähnen. Eventuell auch Initializer Lists, oder verhalten sie sich stets als Objekte von Klassen?
-
Habe mal noch etwas zu Aufzählungen und trivialen Funktionen ergänzt.
initialiser_lsit<T> ist eine ganz normale Klasse, zu std::type_info schreibe ich ja auch nichts.
Evtl. hat noch jemand gute Übersetzungen für scoped/unscoped enumeration und user-provided.
-
Auch von mir einen herzlichen Dank für den Aufwand, camper!
Aufgefallen ist mir praktisch nichts, nur 2 Kleinigkeiten:
Typo: "mindestens eine constexpr-Konstruktor
"(pointer to (non-static) member)" ev. zu "(pointer to (non-static) (class) member)"Streng genommen gehört das nicht hier hinein, aber ich fände es praktisch, wenn man dort gleich noch die Mindestlimits der arithmetischen Typen sieht:
- signed char (-127 -- 127) - short (-32767 -- +32767) - int (-32767 - +32767) - long (-2147483647 -- -2147483647) - long long (-9223372036854775807 -- 9223372036854775807)
- float (6 signifikante Dezimalziffern) - double (10 signifikante Dezimalziffern) - long double (10 signifikante Dezimalziffern)
-
Etwas aufgehübscht. Limits von Datentypen gehören nicht in diesen FAQ-Eintrag, weil es hier um die Klärung von Begriffen geht.
Unterpunkte sind sich ausschließende Alternativen, soweit nicht anders gekennzeichnet.
Alle Typen
- Fundamentale Typen (fundamental types 3.9.1)
- arithmetische Typen (arithmetic types 3.9.1/8)
- integrale Typen (integral types / integer types 3.9.1/7)
- vorzeichenbehaftete integrale Typen (signed integer types 3.9.1/2)
- vorzeichenbehaftet integrale Standardtypen (standard signed integer types 3.9.1/2)
signed char
short int
int
long int
long long int
- erweiterte vorzeichenbehaftete Integer (extended signed integer types 3.9.1/2) - optional (implementation-defined)
- vorzeichenlose integrale Typen (unsigned integral types 3.9.1/3)
- vorzeichenlose integrale Standardtypen (standard unsigned integer types 3.9.1/3)
unsigned char
unsigned short int
unsigned int
unsigned long int
unsigned long long int
- erweiterte vorzeichenbehaftete Integer (extended unsigned integer types 3.9.1/3) - optional (implementation-defined)
- andere
bool
- ist vorzeichenlos, gehört aber nicht zu dieser Kategorie und braucht ein paar Sonderregeln (3.9.1/6)char
- verhält sich implementationsabhängig entweder wie signed char oder unsigned char (3.9.1/1)wchar_t
- verhält sich implementationsabhängig wie ein bestimmter vorzeichenloser oder vorzeichenbehafteter integraler Typ (3.9.1/5)char16_t
- eigenständiger Typ, äquivalent zustd::uint_least16_t
(3.9.1/5)char32_t
- eigenständiger Typ, äquivalent zustd::uint_least32_t
(3.9.1/5)- Gleitkommatypen (floating point types 3.9.1/8)
float
double
long double
void
(3.9.1/9)std::nullptr_t
(3.9.1/10)- Zusammengesetzte Typen (compound types 3.9.2)
- Arrays (arrays)
- Funktionen (function types)
- Zeiger (pointer types)
- Objektzeiger (object pointer types 3.9.2/3)
- Zeiger auf Objekte (pointer to object types)
- Zeiger auf void (pointer to void)
- Funktionszeiger (function pointer types 3.9.2/3)
- Referenzen (references)
- lvalue-Referenzen (lvalue references)
- rvalue-Referenzen (rvalue references)
- Klassen (classes)
union
- Strukturen (structs)
struct
class
- Aufzählungen (enumerations) (s.u.)
- Zeiger auf nicht-statische Member (pointer to (non-static) class member)
Zeichentypen (character types)
char
signed char
unsigned char
Objekttypen (object types 3.9/8)
- alle außer void, Referenzen, Funktionen
Skalare Typen (scalar types) - alle Objekttypen, die keine Komponenten haben
- arithmetische Typen
std::nullptr_t
- Zeiger
- Zeiger auf Member
- Aufzählungen
Aufzählungen (enumerations)
- unscoped enumerations (enum-key =
enum
) - Aufzählungskonstanten werden im gleichen Scope wie die Aufzählung selbst plaziert - scoped enumerations (enum-key =
enum class
/enum struct
) - Aufzählung bildet einen eigenen Scope, in dem sich die Aufzählungskonstanten befinden, keine implizite Konvertierung in integer
Aufzählungstypen haben einen zugrundeliegenden integralen Typen (underlying type), der für die Repräsentation verwendet werden kann.
Dieser kann explizit angegeben werden (enum-base), wird er nicht angegeben, so ist er int im Falle von scoped Aufzählungen. In diesen Fällen ist der zugrundeliegende Typ fest (fixed).
Im Falle von unscoped Aufzählungen ohne Angabe ist der Typ unspezifiziert mit bestimmten Einschränkungen (Details in 7.2/6), in der Praxis typischerweise int oder - soweit erforderlich - ein größerer Typ.Aggregate (aggregates)
- Arrays
- Klassen, die
- keine vom Nutzer deklarierte Konstruktoren haben, und
- keine nicht-statischen protected oder private Datenmember haben, und
- keine Basisklassen haben, und
- keine virtuelle Funktionen haben, und
- keine Initialisierer für nichtstatische Member haben
POD (plain old data)
- Skalare Typen
- POD-Klassen, die
- Klassen-Aggregate sind, und
- keinen vom Nutzer deklarierten Destruktor haben, und
- keinen vom Nutzer deklarierten Zuweisungsoperator haben, und
- keine nichtstatische nicht-POD-Datenmember haben
- union: POD-union
- Struktur: POD-struct
- Arrays aus PODs
Alle POD-Typen sind trivial und haben Standard-Layout.
Literaltypen (literal types)
- Skalare Typen
- Referenzen auf Literaltypen
- Array aus Literalen
- Klassen
- mit trivialen Destruktor, und
- vorhandene Initialisierer für nichtstatische Member sind konstante Ausdrücke bzw. Listen aus solchen Ausdrücken, und
- alle nichtstatischen Datenmember und Basisklassen sind Literaltypen, und
- Klasse
- ist Aggregat
- hat mindestens einen constexpr-Konstruktor, der kein Copy- oder Movekonstruktor ist
Trivial kopierbare Typen (trivially copyable types 3.9/9)
- Skalare Typen
- Klassen
- ohne nicht-trivialen Copy-Konstruktor, und
- ohne nicht-trivialen Move-Konstruktor, und
- ohne nicht-trivialen Copy-Zuweisungsoperator, und
- ohne nicht-trivialen Move-Zuweisungsoperator, und
- mit trivialem Destruktor
- Arrays trivial kopierbarer Typen
Triviale Typen (trivial types 3.9/9)
- Skalare Typen
- Triviale Klassen, das sind
- trivial kopierbare Klassen mit
- trivialem Defaultkonstruktor
- Arrays trivialer Typen
Alle trivialen Typen sind trivial kopierbar.
Standardlayout-Typen (standard-layout types)
- Skalare Typen
- Standardlayout Klassen
- nichtstatische Daten-Member haben Standardlayout, und
- Basisklassen haben Standardlayout, und
- keine virtuellen Funktionen, und
- keine virtuellen Basisklassen, und
- gleiche Zugriffskontrolle für alle nichstatischen Datenmember, und
- höchtens 1 Klasse in der gesamten Vererbungshierarchie definiert nichtstatische Daten-Member, und
- 1. Daten-Member (wenn vorhanden) ist nicht gleichzeitig Basisklasse
- Arrays aus Standardlayout-Typen
UDT (user defined types)
- Klassen
- Aufzählungen
eingebaute Typen (build-in types)
- Typen, die keine UDTs sind
Triviale Memberfunktionen
---------------------------------
Eine spezielle Memberfunktion ist user-provided, wenn sie explizit deklariert wird, und diese 1. Deklaration weder explizit defaulted noch explizit deleted ist.
Zur Vereinfachung im Folgenden:
Eine Subobjektklasse sei eine Klasse, bei der es sich entweder um eine (direkte) Basisklasse oder den Klassentyp eines nichtstatischen Members, oder den Klassentype eines Elementes eines nichtstatischen Memberarrays handelt.Eine spezielle Memberfunktion ist trivial, wenn
- sie nicht user-provided ist, und
- korrespondierende Memberfunktionen aller Subobjektklassen trivial sind, und
- im Falle des Defaultkonstruktors kein nichtstatischer Member über einen Initialisierer verfügt, und
- im Falle des Destruktors dieser nicht virtuell ist
- die Klasse keine virtuellen Funktionen und keine virtuellen Basisklassen hat
Korrespondierende Memberfunktionen i.o.S. sind
- im Falle eines Defaultkonstruktors die Defaultkonstruktoren der Subobjektklassen
- im Falle des Destruktors die Destruktoren der Subobjektklassen
- sonst die Memberfunktionen, die für Copy-/Move der Subobjekte ausgewählt werden (dabei handelt es sich nicht notwendigerweise um Copy-/Move-Konstruktoren oder Zuweisungsoperatoren, allerdings können nur solche trivial sein)