Ich bin mir nicht sicher die wahre Bedeutung vonso kompilierte ich den Code unten, um eine Idee zu bekommen, aber bin jetzt mehr verwirrt.Warum ist das dereferenzierte Element im const-Vektor von int-Zeigern veränderbar?
vector<int *> v;
int x = 1, y = 2;
v.push_back(&x);
v.push_back(&y);
const vector<int *> w = v;
w[0] = &y; //failed. Element is a constant pointer?
*(w[0]) ++; //failed. Element pointer references to constant value?
Wenn ich hier aufgehört hätte, hätte ich angenommen, dass const vector<int *>
ist ein Vektor von const int * const
, aber dann habe ich versucht, die folgenden, die eindeutig diese Annahme widerlegt.
*(w[0]) += 3; //passed. Value not constant?
*(w[0]) = 20; //passed. Why...
Jetzt *(w[0])
für Grund mir unbekannt behandelt offensichtlich ++
und +=
und anders Zuordnung. Ich habe mich davon überzeugt, dass const vector
nur ein konstantes Objekt der Klasse vector
deklariert und dass die obigen Ergebnisse von der tatsächlichen Implementierung der Operatorüberlastung der Klasse vector
abhängen. Aber ich kann meinen Kopf nicht darum drehen. Kann mir bitte jemand erklären helfen?
Wenn es relevant ist, habe ich g ++ 4.2 auf einem Mac verwendet.
Sie könnten dies interessant finden: Ändern Sie den Beitrag zu Pre-Inkrement und sehen, was im zweiten Fehler Beispiel passiert. '++ * (w [0]);'. – WhozCraig
Ich denke, eine große Quelle der Verwirrung ist das Schreiben von '* (w [0]) ++;' anstelle von '(* w [0]) ++;' (was ich denke, war wahrscheinlich das beabsichtigte Ergebnis). Die Priorität für den Operator kann manchmal etwas schwierig sein. – Kat