Не вижу логики: (&**this)
Кусок кода:
_Pt operator->() const
{return (&**this); }
Не понимаю смысла в самой операции (&**this), зачем две *.
Кусок кода:
_Pt operator->() const
{return (&**this); }
Не понимаю смысла в самой операции (&**this), зачем две *.
Лично я так это понимаю. Допустим в начале класса объявлена переменная типа "указатель на _Pt", к примеру, такое объявление в начале класса:
private:
_Pt *pointer;
...
public:
Всем известно что this указывает на первый элемент объекта класса, то есть в данном случае на pointer. В таком случае return(&**this) будет возвращать "адрес значения на которое указывает первый элемент в текущем объекте", то есть по сути эквивалентно записи return(pointer). Я не потрудился проверить свою версию и могу ошибаться.
Нет, this - это указатель, содержащий адрес начала объекта, а что именно будет находиться в области со смещением 0 байт относительно this - очень спорный вопрос.
Кроме того, очень смущает порядок расположения операторов. Код вообще компилируется?????
Кроме того, очень смущает порядок расположения операторов. Код вообще компилируется?????
Нет, все проще... просто первая звездочка дает нам уже сам объект итератора. Т.к. у итератора перегружен оператор '*', то вторая вездочка выдает нам ссылку на объект в итераторе, а уже '&' выдает адрес объекта в итераторе.
Единственное, мне не совсем понятно, почему нельзя было просто написать return &_Myval?
Единственное, мне не совсем понятно, почему нельзя было просто написать return &_Myval?
"Потому, что до зацепа водит мама два прицепа."
Посмотри, как реализованы операторы звездочка (operator*) в разных итераторах. Везде они не просто возвращают ссылку, но и выполняют некоторые необходимые действия.
Посмотри, как реализованы операторы звездочка (operator*) в разных итераторах. Везде они не просто возвращают ссылку, но и выполняют некоторые необходимые действия.
Согласен, но все-таки не везде. Автор приводил пример из хидера <iterator>, я посмотрел туда и увидел следующий код:
{ // return designated value
return (_Myval);
}
const _Ty *operator->() const
{ // return pointer to class object
return (&**this);
}
Собсвенно, поэтому я и ответил так. А в остальном совершенно согласен, другие итераторы выполняют определенные действия в операторе звездочка, поэтому наиболее оптимальным является использование именно такой конструкции.
{ // return designated value
return (_Myval);
}
const _Ty *operator->() const
{ // return pointer to class object
return (&**this);
}
Собсвенно, поэтому я и ответил так. А в остальном совершенно согласен, другие итераторы выполняют определенные действия в операторе звездочка, поэтому наиболее оптимальным является использование именно такой конструкции.
Спасибо, все так и есть, все компилится.