为什么unique_ptr operator *不是noexcept?

时间:2018-02-01 10:40:32

标签: c++ unique-ptr dereference noexcept

在为我的爱好操作系统实现一个基本的std库时,我遇到了这个并想知道原因:

operator->()T* get()都标记为noexcept,但operator*()不是。根据引用,它应该等同于*get(),这将允许它noexcept并且看一些实现,我认为没有理由不这样做。

为什么unique_ptr的解除引用运算符未标记为noexcept

2 个答案:

答案 0 :(得分:8)

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

  

std::remove_reference<Deleter>::type::pointer如果存在此类型,   否则T *。必须满足NullablePointer

这可能是T*的其他内容,它可能是重载operator*的类类型。

答案 1 :(得分:6)

来自cppreference

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

然后:

  

例外:
  1)可以投掷,例如如果pointer定义投掷operator*