2017-05-07 6 views
1

Zum Beispiel habe ich einen Container in ähnlicher Weise wie definieren könnte:Wann ist es ausreichend, const_iterator als konstanten Iterator zu deklarieren?

template <typename T> 
class Example 
{ 
public: 
    using value_type = T; 
    using iterator = value_type*; 
    using const_iterator = const iterator; 
    //etc 
}; 

Allerdings ist es in Ordnung, das mit einem benutzerdefinierten Iterator zu tun?

template<typename T> 
class Example 
{ 
public: 
    using value_type = T; 
    /*friend?*/ class iterator; 
    using const_iterator = const iterator; //is this okay? 
    //etc 
}; 

Eine ausführliche Erklärung würde geschätzt werden.

Antwort

4

Ein const_iterator und ein const iterator repräsentieren zwei verschiedene Dinge. In jedem Fall gilt die const für etwas anderes: das Objekt "zeigte auf" durch den Iterator im ersten Fall und der Iterator selbst in der zweiten. Es ist also nie "ausreichend", eines für das andere zu verwenden.

In Zeiger sprechen (und Zeiger sind Iteratoren), dies wäre der Unterschied zwischen "Zeiger auf Const" und "Const Zeiger".

const int* it; // pointer to const int: a const_iterator 
int* it const; // const pointer to int: a const iterator 

Sie auch const Iteratoren haben const oder const const_iterator:

const int* it const; 
+0

Also, im zweiten Fall, das bedeutet, dass die const iterator können nur auf einen bestimmten Ort? – AldenB

+0

@AldenB Korrekt, Sie können den Iterator nicht ändern, sodass Sie ihn nicht anderswo zeigen können. Aber Sie können das ändern, worauf es hinweist. – juanchopanza

+0

Verstanden! Vielen Dank :) – AldenB

Verwandte Themen