2017-05-07 18 views
1

例えば、私はと同様にコンテナを定義することができます。const_iteratorをconstイテレータとして宣言することは十分ですか?

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

しかし、それはユーザー定義の反復子でこれを行うには大丈夫でしょうか?

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

詳細な説明が理解できます。

答えて

4

const_iteratorおよびconst iteratorは、2つの異なるものを表す。いずれの場合も、constは異なるものに適用されます。つまり、最初のケースのイテレータが指すオブジェクトと2番目のイテレータのイテレータ自体です。だから、それを他のものに使うのは決して十分ではありません。

ポインタが話す(そしてポインタはイテレータです)、これは "ポインタへのポインタ"と "constポインタ"の違いになります。あなたも、constのconstのためのイテレータ、またはconst const_iterator持つことができ

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

:だから

const int* it const; 
+0

を、後者の場合には、それはconstのイテレータがある特定の場所にだけ指すことができることを意味するのでしょうか? – AldenB

+0

@AldenB正解ですが、イテレータを変更することはできません。したがって、別の場所を指すようにすることはできません。しかし、それが指しているものを変更することができます。 – juanchopanza

+0

ありがとうございました :) – AldenB

関連する問題