Есть ли разница между использованием .get () и оператора ->? - PullRequest
4 голосов
/ 08 февраля 2020

Я занимаюсь подготовкой к тесту на С ++, и один из вопросов таков:

std::unique_ptr<Rectangle> rec = std::make_unique<Rectangle>(0, 0, 15, 15);

// why must we use rec.get()->?
rec.get()->setWidth(30);
rec.get()->draw();

Мне интересно, зачем нам здесь .get()? Было бы то же самое, если бы я пропустил .get(), например:

rec->setWidth(30);
rec->draw();

Ответы [ 3 ]

3 голосов
/ 08 февраля 2020

.get() не требуется в вашем случае, так как rec->draw() отменяет ссылку на базовый указатель, и поэтому вы можете использовать уникальные указатели с тем же синтаксисом, что и необработанные указатели. .get() необходимо, когда вам нужно передать свой уникальный указатель в функцию, которая принимает необработанный указатель в качестве параметра.

3 голосов
/ 08 февраля 2020

Согласно cppreference , использование оператора -> равно эквивалентному использованию функции get() (случай 2 в приведенной ниже цитате):

имя типа std :: add_lvalue_reference :: оператор типа * () const; (1) оператор указателя -> () const noexcept; (2) Возвращаемое значение 1) Возвращает объект, принадлежащий * this, эквивалентно * get (). 2) Возвращает указатель на объект, принадлежащий * this, то есть get ().

Далее и в качестве примера (хотя никогда не следует полагаться на Speci c реализации STL), определения std::unique_ptr::get() и его «эквивалентный» оператор -> в версии заголовка <memory> Visual Studio (MSV C) идентичны :

    _NODISCARD pointer get() const noexcept {
        return _Mypair._Myval2;
    }
    _NODISCARD pointer operator->() const noexcept {
        return _Mypair._Myval2;
    }
0 голосов
/ 08 февраля 2020

Интеллектуальные указатели разработаны, чтобы действовать как необработанные указатели в большинстве аспектов, кроме управления памятью. Таким образом, их легко принять с минимальными изменениями. В частности, они предназначены для разыменования с использованием того же синтаксиса, что и необработанные указатели. Это означает, что вы можете использовать rec-> вместо rec.get()-> и *rec вместо *(rec.get()).

...