为什么 unique_ptr operator* 不是 noexcept?

Why is unique_ptr operator* not noexcept?

在为我的爱好实现一个基本的 std 库时 OS 我遇到了这个并想知道为什么:

operator->()T* get() 都标记为 noexcept,但 operator*() 不是。根据参考,它应该等同于 *get(),这将允许它成为 noexcept 并且查看一些实现我看不出为什么它不是。

为什么 unique_ptr 的取消引用运算符未标记为 noexcept

因为 operator* 对于 pointer 类型的 std::unique_ptr 可能会抛出。 pointer 类型别名是 defined as:

std::remove_reference<Deleter>::type::pointer if that type exists, otherwise T*. Must satisfy NullablePointer

这可能是 T* 以外的东西,它可能是重载 operator* 的 class 类型。

来自cppreference

  • typename std::add_lvalue_reference<T>::type operator*() const; (1) (since C++11)
  • pointer operator->() const noexcept; (2) (since C++11)

然后:

Exceptions:
1) may throw, e.g. if pointer defines a throwing operator*