使用 .get() 和 -> 运算符有区别吗?

Mic*_*ell 5 c++ pointers smart-pointers

我正在学习 C++ 测试,其中一个问题如下:

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();
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我们需要这里.get()?如果我省略了,这会是一样的吗.get(),如下所示:

rec->setWidth(30);
rec->draw();
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 4

根据cppreference,使用->运算符相当于使用get()函数(下面引用中的情况 2):

类型名 std::add_lvalue_reference::type 运算符 *() const; (1)
指针运算符->() const noexcept;(2)

返回值
1)返回*this拥有的对象,相当于*get()。
2)返回一个指向*this所拥有的对象的指针,即get()。

此外,举例来说(尽管永远不应该依赖于STL 的特定实现),头文件的 Visual Studio (MSVC) 版本中的定义std::unique_ptr::get()及其“等效”运算符是相同的-><memory>

    _NODISCARD pointer get() const noexcept {
        return _Mypair._Myval2;
    }
    _NODISCARD pointer operator->() const noexcept {
        return _Mypair._Myval2;
    }
Run Code Online (Sandbox Code Playgroud)