在为我的爱好操作系统实现一个基本的std库时,我遇到了这个并想知道原因:
operator->()
和T* get()
都标记为noexcept,但operator*()
不是。根据引用,它应该等同于*get()
,这将允许它noexcept
并且看一些实现,我认为没有理由不这样做。
为什么unique_ptr
的解除引用运算符未标记为noexcept
?
答案 0 :(得分:8)
因为operator*
pointer
类型的std::unique_ptr
可能会抛出。 pointer
类型别名为defined:
std::remove_reference<Deleter>::type::pointer
如果存在此类型, 否则T
*。必须满足NullablePointer
这可能是T*
的其他内容,它可能是重载operator*
的类类型。
答案 1 :(得分:6)
typename std::add_lvalue_reference<T>::type operator*() const;
(1)(自C ++ 11起)pointer operator->() const noexcept;
(2)(自C ++ 11起)
然后:
例外:
1)可以投掷,例如如果pointer
定义投掷operator*