Во время тестирования в университете я столкнулся с этим вопросом относительно списков в STL, C ++ версии 98:
Учитывая эти строки:
list<A*> l; l.push_back(new A);
что
возвращаемый тип звонка**(l.begin())
?
Среди доступных ответов был A
а также A&
(остальные не имеют отношения).
Я предполагал, что это будет , но профессор заявил, что это &.
Я узнал, что разыменование итератора возвращает ссылку на элемент списка, поэтому *(l.begin())
должен вернуть объект, тип которого (A*)&
,
Тогда еще раз **(l.begin())
должен «проходить через» ссылка, заданная контейнером списка и даже через указатель на A и в конечном итоге вернуть объект A
тип.
Какова правильная интерпретация? Пожалуйста, предоставьте объяснение.
Если p
имеет тип A*
, затем *p
имеет тип A&
,
Если p
имеет тип A*&
(ссылка на указатель), затем *p
также имеет тип A&
,
Если x
имеет type list<T>::iterator
, затем *x
имеет тип T&
, и если T==A*
, затем **x
имеет тип A&
,
В раздел 5.3.1 ты можешь найти
Одинарный
*
Оператор выполняет косвенное выражение: выражение, к которому он
применяется указатель на тип объекта или указатель на
тип функции и результат именующий ссылаясь на объект или
функция, на которую указывает выражение. Если тип выражения
это «указатель наT
Тип результата «T
«.