C++ (und C) strenge Aliasing-Regeln beinhalten, dass a char*
und unsigned char*
kann ein Alias für jeden anderen Zeiger sein.
AFAIK gibt es keine analoge Regel für uint8_t*
.
Daher meine Frage: Was sind die Aliasing-Regeln für a std::byte
Zeiger?
Die C++-Referenz ist derzeit nur spezifiziert:
Wie die Zeichentypen (char, unsigned char, signed char) kann er verwendet werden, um auf den von anderen Objekten belegten Rohspeicher zuzugreifen (Objektdarstellung), aber im Gegensatz zu diesen Typen ist er kein Zeichentyp und kein arithmetischer Typ.
Aus dem aktuellen Standardentwurf ([basic.types]/2):
Für jedes Objekt (außer einem Unterobjekt der Basisklasse) vom trivial kopierbaren Typ T, unabhängig davon, ob das Objekt einen gültigen Wert vom Typ T enthält oder nicht, die zugrunde liegenden Bytes ([intro.memory]) aus denen das Objekt besteht, kann in ein Array von kopiert werden char, unsigned char oder std::byte
([cstddef.syn]).43 Wenn der Inhalt dieses Arrays zurück in das Objekt kopiert wird, soll das Objekt anschließend seinen ursprünglichen Wert behalten.
Also ja, für die drei Typen gelten die gleichen Aliasing-Regeln, genau wie cppreference zusammenfasst.
Es könnte auch wertvoll sein zu erwähnen ([basic.lval]/8.8):
Wenn ein Programm versucht, auf den gespeicherten Wert eines Objekts über einen anderen glvalue als einen der folgenden Typen zuzugreifen, ist das Verhalten undefiniert:
- ein char, unsigned char oder std::byte-Typ.
.
de.cppreference.com/w/cpp/language/… Die gleichen Aliasing-Regeln gelten für
std::byte
wie zuchar
– Justin
21. Apr. ’17 um 20:43
@Justin: Vielleicht möchten Sie etwas klarer sein, da “die Regeln gelten” nicht sagt, welche Regeln gelten.
std::byte
hat die gleichen Regeln wiechar
undunsigned char
.– ShadowRanger
21. Apr. ’17 um 20:45
@Justin: Nicht als du zum ersten Mal gepostet hast (du hattest: “en.cppreference.com/w/cpp/language/… Die Aliasing-Regeln gelten für .”
std::byte
“). Sie haben es seitdem bearbeitet; ich habe es vor der Bearbeitung geladen. Danke für die Korrektur.– ShadowRanger
21. Apr. ’17 um 20:49