Почему std :: vector :: iterator :: operator-> раскрывает только один уровень? - PullRequest
1 голос
/ 24 февраля 2020

Этот код не компилируется:

void foo(vector<unique_ptr<pair<int, int>>> bar)
{
    bar.begin()->first;
}

В чем здесь проблема? Разве operator-> не должен углубляться до pair?

1 Ответ

2 голосов
/ 24 февраля 2020

Не следует operator-> развернуть до pair?

Рекурсия operator -> работает только до получения типа указателя. Как только это произойдет, рекурсия останавливается, и вы получаете доступ к тому, на что указывает указатель. В этом случае std::vector::iterator::operator-> возвращает unique_ptr<pair<int, int>>* как тип указателя элемента в векторе. Как только вы нажмете на этот указатель, у вас останется доступ к членам unique_ptr, а не к pair<int, int>, на который он указывает.

Вы можете получить то, что хотите, используя

(*bar.begin())->first;

, так теперь вы используете operator-> из unique_ptr<pair<int, int>>.

...