Ich verstehe, dass so etwas in Ordnung ist:
%Vor%Was ist damit?
%Vor% Der Ausdruck *ipp
ist ein Lvalue des Typs int *
, wird jedoch verwendet, um auf ein Objekt vom Typ const int *
zuzugreifen. (Nämlich, cip
).
Laut dem Buchstaben des Standards handelt es sich um eine strenge Aliasing-Verletzung: Die Liste der zulässigen Alias-Typen enthält kein Aliasing T *
als const T *
oder umgekehrt.
Die nächste Ausnahme ist diese: (C11 6.5 / 6 Auszug)
- eine qualifizierte Version eines Typs, der mit dem effektiven Objekttyp
kompatibel ist
"qualifizierte Version" ist durch C11 6.2.5 / 26 eindeutig definiert:
Jeder unqualifizierte Typ hat mehrere qualifizierte Versionen seines Typs, die den Kombinationen von eins, zwei oder allen drei
const
,volatile
, undrestrict
Qualifier. Der qualifizierte oder unqualifizierte Versionen eines Typs sind unterschiedliche Typen, die zu derselben Typkategorie gehören und dieselben Anforderungen an Darstellung und Ausrichtung haben. Ein abgeleiteter Typ wird nicht von den Qualifikationsmerkmalen (falls vorhanden) des Typs, von dem er abgeleitet wird, qualifiziert.
Die Ausnahme ist, dass T
als const T
und umgekehrt aliasiert werden kann, aber es gibt keine ähnliche Ausnahme für Zeiger auf aliasable Typen. const T *
ist keine qualifizierte Version von T *
.
Allerdings gibt es natürlich die Fußnote:
Die Absicht dieser Liste besteht darin, die Umstände anzugeben, unter denen ein Objekt ein Alias sein kann oder nicht.
Ich konnte nicht sagen, ob die Absicht der Regel darin besteht, dass const T *
und T *
aliasierbar sind oder nicht. Es scheint mir unklar zu sein, welchen Zweck die Angabe von T *
und const T *
"die gleichen Darstellungs- und Ausrichtungsanforderungen" (6.2.5 / 28) haben würde, wenn sie nicht aliasierbar wäre.
Tags und Links c const undefined-behavior language-lawyer strict-aliasing