typedef und Container mit Const-Zeigern

8

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)?

    
Dan Hook 27.01.2010, 16:58
quelle

6 Antworten

9

Kurze Antwort:

  1. ist eine Liste von Zeigern zu konstanten Eingängen.
  2. ist eine Liste von konstanten Zeigern auf Ints.
  3. ist das gleiche wie 2.

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.

    
bltxd 27.01.2010, 17:08
quelle
8

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.

    
Pontus Gagge 27.01.2010 17:04
quelle
5

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.

    
Mike DeSimone 27.01.2010 17:05
quelle
5

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.

    
AnT 27.01.2010 17:25
quelle
3

const int * ist das gleiche wie das Schreiben von int const * , was einen konstanten Wert bedeutet, auf den ein nicht konstanter Zeiger zeigt.

Mit dem Typedef definieren Sie den Zeiger selbst als Konstante, wie in Ihrer 3. Anweisung.

    
gregseth 27.01.2010 17:06
quelle
0

Ich bin sicher, dass Sie wissen, dass const IntPtr und IntPtr const vom selben Typ sind. Was bedeutet, dass list<const IntPtr> und list<IntPtr const> vom selben Typ sind. Was bedeutet, dass Sie versuchen, dies zu kompilieren:

%Vor%     
MarcH 09.11.2010 22:33
quelle

Tags und Links