Spaß mit Array-Typbezeichnern
Verfasst: 01.07.2012, 16:49
Ich komme gerade von einer meiner Expedition aus den C++-Gebieten oberhalb des nördlichen Polarkreises persönlichen Erkenntniskreises zurück. Mein Logbuch:
- Krishtys schöne „Von-rechts-nach-links-Leseregel“ funktioniert leider nicht, sobald man Arrays benutzt:
- (&i)[3] ist eine Referenz auf ein 3-Array von ints,
- &(i[3]) ist ein 3-Array von Referenzen auf ints.
- Die Notation von Funktionen, die eine Referenz oder einen Pointer auf ein Array zurückgeben, ist relativ archaisch:
Das ganze gibt's hier auch in Aktion zu sehen.
Code: Alles auswählen
// Gibt eine Referenz auf ein 3-Array von ints zurück int (& getThreeInts()) [3] { static int theInts[3] = { 1, 2, 3 }; return theInts; }
- Ich hatte mich schon einmal hier mit dem Zusammenspiel von Array-Referenzen und Templates befasst. Wie mir heute plötzlich aufgefallen ist, kann man das generalisieren und für eine Variante des „wie groß ist mein Array“-Problems benutzen:
Code: Alles auswählen
template <typename theType, size_t theSize> char (& AsArray(theType (&) [theSize])) [theSize];
(Auch hier live und in Farbe). Im Gegensatz zu sizeof(…)/sizeof(…[0]) funktioniert es korrekterweise nicht mit Pointern. Es ist somit tatsächlichCode: Alles auswählen
struct { int i; double d; } array[10]; double * notAnArray; // Funktioniert. std::cout << sizeof(AsArray(array)) << std::endl; std::cout << sizeof(array) / sizeof(array[0]) << std::endl; // Funktioniert nicht; soll es auch nicht! // std::cout << sizeof(AsArray(notAnArray)) << std::endl; // Funktioniert; undefiniertes Verhalten. std::cout << sizeof(notAnArray) / sizeof(notAnArray[0]) << std::endl;
der Held den Gotham brauchttypsicherer als das sizeof(…)/sizeof(…[0])-Konstrukt.