Die folgende Codezeile kompiliert einfach und verhält sich:
%Vor%Die folgenden zwei Zeilen nicht:
%Vor%Ich bekomme genau die gleichen Kompilierfehler für
%Vor%Mir ist klar, dass die letzte Zeile nicht legal ist, da die Elemente eines STL-Containers zuweisbar sein müssen. Warum interpretiert der Compiler (2) dasselbe wie (3)?
Kurze Antwort:
const (und volatile) sollte natürlich nach dem Typ erscheinen, für den sie sich qualifizieren. Wenn Sie es zuvor schreiben, schreibt der Compiler es intern automatisch um:
%Vor%wird
%Vor%was ein Zeiger auf eine Konstante int ist. Listen davon werden gut kompiliert, da der Zeiger selbst noch zuweisbar ist.
Sie lesen Typ-C-Deklarationen von rechts nach links. So ist "const int *" ein Zeiger auf konstante ints ("const int" und "int const" bedeuten dasselbe). Diese sind perfekt zuweisbar. Aber (2) und (3) sind konstante Zeiger auf int und daher nicht zuweisbar.
const IntPtr
und const int*
sind nicht dasselbe.
1) const int*
ist "Zeiger auf const int
".
2) const IntPtr
wird auf int * const
erweitert (think (int *) const
) was " const
pointer to int
" ist.
Kurz gesagt, typedef
verhält sich wie eine Klammer. Sie können die const
-ness nicht ändern, auf die ein typedef
'd Zeiger zeigt.
Sie fragen: "Warum ist der Compiler, der (2) interpretiert, gleich (3)?". Nun, weil in C ++ Sprache (sowie in C) sie sind semantisch gleich. Wenn Sie einen Typnamen als
definieren %Vor% später steht der Typ const IntPtr
für int *const
, nicht für const int *
. So funktionieren Typedef-Namen in C ++.
Typedef-Namen in C ++ sind keine Makros. Während sie keine neuen Typen definieren (nur Aliase für die vorhandenen), sind die resultierenden Aliase dennoch "atomar", "monolithisch" in dem Sinne, dass alle auf den Alias angewendeten Qualifizierer als oberste Ebene Qualifikanten. Wenn Sie mit einem typedef-name arbeiten, gibt es keine Möglichkeit, ein const-Qualifikationsmerkmal "einzuschleichen", so dass es irgendwie auf einen niedrigeren Level des Typs "absteigt" ( int
in Ihrem Fall).
Wenn Sie darauf bestehen, typedef-names zu verwenden, haben Sie keine andere Wahl, als zwei verschiedene typedef-Namen anzugeben, wie
%Vor% und verwenden Sie ConstIntPtr
, wenn Sie eine Zeiger-zu-Konstante-Version des Typs benötigen.
Tags und Links c++ stl typedef containers