LINUX.ORG.RU

C++ &*

 


0

1

Вот коментарий из stl_iterator.h

  // 24.4.1 Reverse iterators
  /**
   *  Bidirectional and random access iterators have corresponding reverse
   *  %iterator adaptors that iterate through the data structure in the
   *  opposite direction.  They have the same signatures as the corresponding
   *  iterators.  The fundamental relation between a reverse %iterator and its
   *  corresponding %iterator @c i is established by the identity:
   *  @code
   *      &*(reverse_iterator(i)) == &*(i - 1)
   *  @endcode
   *
   *  <em>This mapping is dictated by the fact that while there is always a
   *  pointer past the end of an array, there might not be a valid pointer
   *  before the beginning of an array.</em> [24.4.1]/1,2
   *
   *  Reverse iterators can be tricky and surprising at first.  Their
   *  semantics make sense, however, and the trickiness is a side effect of
   *  the requirement that the iterators must be safe.
  */

Объясните, пожалуйста, смысл данного выражения:

&*(reverse_iterator(i)) == &*(i - 1)

И что означает &* ?


оператор * перегружается в итераторе и возвращает непосредственное значение, & соот-но возвращает адрес значения, чтоб сравнить два адреса, а не значения

wota ★★
()

Если я правильно понял, то берется адрес элемента, на который указывает итератор.

reverse_iterator(i) возвращает итератор на элемент, от которого берется * , который возвращает сам элемент, от которого берется & , возвращающий его адрес. Данная конструкция призвана показать, что reverse_iterator(i) и (i - 1) указывают на один и тот же элемент.

Ivan_qrt ★★★★★
()

разыменовать и взять адрес

annulen ★★★★★
()
Ответ на: комментарий от v0r0n

Кстати, сейчас уже можно использовать «addressof».

DarkEld3r ★★★★★
()
Ответ на: комментарий от wota

возвращает непосредственное значение

Точнее ссылку на значение. А & от ссылки на объект это уже его голый адрес (обычный указатель) в памяти (по задумке — non-null, хотя с точки зрения машинного представления ссылка это уже просто адрес). Просто по значению без ссылки & не будет работать, так как хочет lvalue.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Точнее ссылку на значение.

не обязательно, это уже от реализации зависит, может быть и копия, и умный указатель, и сконструированное на лету новое значение

wota ★★
()
Ответ на: комментарий от wota

Можно сделать класс со своим operator&, да, то есть в общем случае это reference-like тип (то есть iterator_traits<Iterator>::reference, который заявлен как результат operator*) — или обычный & с примитивным operator& или свой тип с operator&, но вот примитивный тип по значению из итератора вернуть не получится, то есть получится, но тогда operator& не будет работать, так его нет и он не определяется, как я понимаю.

quasimoto ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Нет. В контексте «Reverse iterators» это операция взятия адреса от переменной в контейнере, смещение внутри контейнера задаёт итератор.

#include <iostream>
#include <vector>
#include <iterator>
#include <typeinfo>

using namespace std;

int main()
{
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);

    vector<int>::reverse_iterator it_r = vec.rbegin();

    cout << *it_r << endl; // 2
    cout << &*it_r << endl; // 0x97f2034 (address)

    cout << typeid(*it_r).name() << endl; // i (GCC 4.7.3)
    cout << typeid(&*it_r).name() << endl; // Pi (GCC 4.7.3)

    return 0;
}

И раз уж на то пошло

    int i = 5;
    int * pi = &i;
    int *& rpi = pi;
//    int &* rpi = pi; /* Wrong */

v0r0n
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.