При строгом чтении стандарта; [iterator.iterators]/2 (§24.2.2/2) делает намек на тип X
квалификационный как итератор;
... a
и b
обозначают значения типа X
или const X
... r
обозначает значение X&
...
A Тип X
удовлетворяет требованиям итератора, если:
Учитывая код;
template <class T>
struct X {
T& operator*() & { return t; }
T& operator*() && = delete;
X& operator++() { return *this; }
T t;
};
int main()
{
X<int> x;
++x;
int i = *x;
X<int> y(x);
using std::swap;
std::swap(x, y);
}
Конечно, похоже, удовлетворяет этим требованиям.
Тем не менее, история продолжается, итератора Концепция, как определено выше, не указан в качестве одного из итератора категорий в стандартном §24.2.1/2;
Настоящий стандарт определяет пять категорий итераторов, в соответствии с операциями, определенными на них: итераторы ввода, вывода итераторы, форвардные итераторов, двунаправленные итераторы и случайные итераторы доступа ...
Все они определяют операция *a
and *r++
, для которой тип X
не скомпилирован;
int j = *x++; // fails to compile even with the inclusion of the post increment operator
const X<int> xc {};
int ic = *x1; // no const overloads
Для итератора, который будет использоваться в пределах одной из определенных категорий, она должна включать в себя дополнительные элементы для де ссылок const
ценности, lvalues и rvalues, почтовое приращение и т.д. В spirit of the standard;
Итераторы - это обобщение указателей, которые позволяют программе на С ++ работать с различными структурами данных (контейнерами) единообразно.
Руководство здесь для перегруженных членов и операторов является то, что они могут/должны быть добавлены для обеспечения соблюдения и оптимизации (если это возможно) реализацию семантики обобщенной указателю - не запретить семантику; ограничение семантики может иметь непреднамеренные последствия.
Действительно ли это C++? – 6502
@ 6502 добавлен как tag 'C++ 14' – alexolut
Я не знаю, что означает' && = delete', должно быть указано – 6502