2016-01-19 2 views
0

Во время испытания в университете я столкнулся этот вопрос относительно списков в STL, C++ версии 98:
Возвращение типа би-разыменованных итератора

Учитывая эти строки: list<A*> l; l.push_back(new A); Какой тип возвращения из позвонить **(l.begin())?

Среди возможных ответов было A и A& (другие не актуальны).

Я предположил, что это будет , но профессор сказал, что это &.

Я узнал, что разыменование итератора возвращает ссылку на элемент списка, поэтому *(l.begin()) должен вернуть объект, тип которого равен (A*)&.
Тогда другое разыменование, такое как **(l.begin()) должно «пройти» ссылку, указанную контейнером списка, и даже через указатель на A и в конечном итоге вернуть объект типа A.

Какая правильная интерпретация? Просьба дать пояснения.

+0

'A' очень отличается от' A & ', там нет места для интерпретации и вы могли бы просто попробуйте его – user463035818

+0

@ tobi303 Я знаю разницу между переменной и ссылкой на переменную. Пожалуйста, прочитайте мой вопрос еще раз. В любом случае, спасибо. –

ответ

2

Если p имеет тип A*, то *p имеет тип A&.

Если p имеет тип A*& (ссылка на указатель), то *p также типа A&.

Если x имеет type list<T>::iterator, то *x имеет тип T&, и если T==A*, то **x имеет тип A&.

+0

Спасибо за редактирование, Натан. Я не знал об этой возможности. Есть ли документация об этой уценке/разметке? –

+0

Есть "?" значок справа от панели инструментов редактирования, над областью издания. – Quentin

+1

@AdiLevin http://stackoverflow.com/editing-help – NathanOliver

0

В section 5.3.1 вы можете найти

Унарный * оператор выполняет косвенность: выражение, к которому он применяется должен быть указателем на тип объекта, или указатель на тип функции и результат is lvalue, ссылающийся на объект или функция, к которой относится выражение. Если тип выражения является «указатель на T,» тип результата «T

+0

совершенно бесполезно и не связано с моим вопросом. –

+0

@bebo Извините за бесполезность моего поста. Я нашел ваш вопрос интересным, и я попытаюсь найти в справочнике C++ объяснение того, что сказал ваш профессор. – alangab

+0

Спасибо за ваши усилия. Я считаю ваш ответ бесполезным, потому что он не отвечает на мои сомнения, поскольку это всего лишь цитата из руководства. Если вы расскажете, что вы думаете о моем вопросе и связать некоторые источники, я могу принять ваш ответ. –

Смежные вопросы