2016-09-05 6 views
7

Warum ist std::array ‚s Daten std hier andersconst Ausbreitung :: Array von Zeigern

im Vergleich zu hier
using T = const int *; 
std::array<T, 4> x = { &a, &b, &c, &d }; // name: class std::array<int const *,4> 
x[0] = &c; // OK : non-constant pointer 
*x[0] = c; // Error : constant data 

instanziiert Typ ist?

using T = int *; 
std::array<const T, 4> x = { &a, &b, &c, &d }; // name: class std::array<int * const,4> 
x[0] = &c; // Error : constant pointer 
*x[0] = c; // OK : non-constant data 

Dieser zweite Fall entspricht const std::array<T, 4> (konstante Zeiger auf nicht konstante Daten). Wenn wir const int * direkt verwenden: std::array<const int*, 4> erhalten wir das erste Fallverhalten.

Also genauer, warum ist using T = int*; std::array<const T, 4>; entspricht std::array<int*const, 4> und nicht std::array<const int*, 4>?

+1

Die kurze Antwort ist: weil so C++ funktioniert. Der Typ ist ein Zeiger auf etwas. Das Anwenden des Modifikators "const" macht es zu einem konstanten Zeiger auf etwas. Das Ende. –

+7

Nur weil ich deine Hausadresse auf meiner Brust tätowieren will, heißt das nicht, dass du dich nicht bewegen darfst. – StoryTeller

+0

Eins ist ein Const-Zeiger auf veränderbare Objekte und eins ist ein veränderbarer Zeiger auf Const-Objekte – Julius

Antwort

5

warum ist using T = int*; std::array<const T, 4>; entspricht std::array<int*const, 4> und nicht std::array<const int*, 4>?

Da const qualifiziert ist, auf T, der Zeiger selbst, es ist nicht (und konnte nicht) auf dem pointee qualifiziert. Also const T bedeutet const Zeiger, nicht Zeiger auf const.

Die Regel ist gleich, ob T Zeiger ist oder nicht.

using T = int; // const T => int const 
using T = int*; // const T => int* const, not int const* 
using T = int**; // const T => int** const, neither int* const*, nor int const** 

Notiere die dritte Beispiel, wenn const auf dem pointee qualifiziert ist, sollte const Tint* const* sein, oder es sollte auf dem pointee von pointee, das heißt int const** qualifiziert werden?

+0

Danke für die Antwort! Nur um sicher zu sein habe ich verstanden, bin ich richtig im Denken: Typabzug tritt nach const Qualifikation ein? Oder ist es komplizierter? – Judge

+0

@Judge Kein Typabzug hier, der Typ wird explizit angegeben. – songyuanyao

+0

Guter Punkt :) und danke für den Schnitt, es macht mehr lexikografischen Sinn dafür, dass es jetzt so ist. Lassen Sie mich die Frage neu formulieren: Gibt es vor der Typ-Substitution eine const-Qualifizierung? Gilt das auch für andere Modifikatoren wie "volatile"? – Judge

0
using T = const int *; //T is a pointer to a CONSTANT integer. 
std::array<T, 4> x = { &a, &b, &c, &d }; //array of PointerToConstantInteger, size=4 

Ändern, um die Elemente des Arrays x, aber nicht verfolgen und versuchen Wert darin gespeichert zu ändern.

using T = int *; //T is a pointer to an integer. 
std::array<const T, 4> x = { &a, &b, &c, &d }; //array of CONSTANT IntegerPointer, size=4 

Kann nicht die Elemente des Arrays nicht ändern x, aber kein Problem in dereferencing und Wert darin gespeichert zu ändern.