*smart_ptr 和 *smart_ptr.get() 有什么区别

What is the difference between *smart_ptr and *smart_ptr.get()

据我所知,取消引用 - *smart_ptrget() + 取消引用 *smart_ptr.get() 使用智能指针做同样的事情,但可能有一些东西在引擎盖下我不知道,因为我看到很多案例都使用了第二种方法,那有什么意义呢?它会以任何方式影响性能吗?

没有区别。 [unique.ptr.single.observers] and [util.smartptr.shared.obs] 中的标准都将 operator* 定义为 *get().


get 当您需要指向托管对象的原始指针以传递给仅除原始指针之外的对象时,应使用。否则,*-> 为智能指针重载以将这些操作应用于托管指针。


您可能会想使用 &*smart_ptr 来获取指向托管对象的原始指针,但 & 是一个可以重载并可能给您错误结果的运算符。获取地址(指针)的正确方法是 std::addressof(*smart_ptr),但使用 smart_ptr.get() 更短。

从功能的角度来看,*smart_ptr*(smart_ptr.get()) 之间没有区别,因为它们在 C++ 标准中被定义为做同样的事情——取消引用持有的指针和 return 指向对象的引用。

但是,从调试的角度来看,可能存在细微差别,具体取决于实施方式。 get() 定义为 return 按原样保存指针,无论它是否为 nullptr。智能指针不知道调用者之后将如何处理该指针。但是,取消引用 nullptr 未定义的行为 ,并且知道, 可能 智能指针实现 可以 决定让它 operator* 在无法取消引用持有的指针时抛出运行时错误,以帮助调试工作。

cppreference 上提到了这一点,至少 std::unique_ptr::operator*:

may throw, e.g. if pointer defines a throwing operator*