2017-04-21 4 views
17

C++ (und C) strikte Aliasing-Regeln enthalten, dass ein char* und unsigned char* alias jeden anderen Zeiger Alias ​​können.Hat ein std :: byte-Zeiger die gleichen Aliasing-Implikationen wie char *?

AFAIK gibt es keine analoge Regel für uint8_t*. Also meine Frage: Was sind die Aliasing-Regeln für einen std::byte Zeiger?

Die C++ Referenz derzeit nur specifies:

Wie die Zeichentypen (char, unsigned char, signed char) es verwendet werden kann durch andere Objekte (Objektdarstellung) besetzt roh Speicher zuzugreifen, aber im Gegensatz zu denen, Typen, es ist kein Zeichentyp und kein arithmetischer Typ.

+4

http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing Die gleichen Regeln gelten für Aliasing 'std :: byte' zu' char' – Justin

+2

@Justin: Vielleicht möchten um ein wenig klarer zu sein, denn "die Regeln gelten" sagt nicht, welche Regeln gelten. 'std :: byte' hat dieselben Regeln wie' char' und 'unsigned char'. – ShadowRanger

+0

@Justin: Nicht bei der ersten Veröffentlichung (Sie hatten: "en.cppreference.com/w/cpp/language/... Die Aliasregeln gelten für' std :: byte' "). Du hast seitdem bearbeitet; Ich habe es vor der Bearbeitung geladen. Danke für die Reparatur. – ShadowRanger

Antwort

14

Aus dem aktuellen Norm-Entwurf ([basic.types]/2):

Für jedes Objekt (außer einer Basisklasse subobject) von trivialem kopierbar Typ T, ob die Objekt enthält einen gültigen Wert vom Typ T, die zugrunde liegenden Bytes ([intro.memory]), die das Objekt bilden, können in ein Array von char, unsigned char oder std :: byte ([cstddef .syn]). Wenn der Inhalt dieses Arrays in das Objekt zurückkopiert wird, muss das Objekt anschließend seinen ursprünglichen Wert beibehalten.

Also ja, die gleichen Aliasing-Regeln gelten für die drei Typen, genauso wie cppreference zusammenfasst.

Es könnte auch nützlich sein, ganz zu schweigen ([basic.lval] /8.8):

Wenn ein Programm den gespeicherten Wert eines Objekts durch eine glvalue anderer als einer der zuzugreifen versucht folgende Typen Das Verhalten ist undefined:

  • ein Zeichen, unsigned char oder Std :: Byte-Typ.
Verwandte Themen