range の定義

この条件を満たしていれば、基本的に使用できる。

例)

int array[] = {0, 1, 2, 3, 4, 5};   // 配列型なので、OK
int* p = array;                     // ポインタ型なので、NG

std::vector<int> vec;               // 必要なメンバを持っているので、OK
std::pair<
    std::vector<int>::iterator,
    std::vector<int>::iterator
> pair = std::make_pair(vec.begin(), vec.end()); // iterator 型を保持してるので、OK

struct my_array_{
    int array[5];
} my_array;                         // メンバがないので、NG

struct my_array_ex_{
    int array[5];
    typedef int* iterator;
    typedef const int* const_iterator;
    iterator begin(){ return &array[0]; };
    iterator end(){ return &array[5]; };
    const_iterator begin() const{ return &array[0]; };
    const_iterator end() const{ return &array[5]; };
} my_array_ex;                     // 必要なメンバを持っているので、OK