В стандартном черновике С++ (N3485) указано следующее:
20.7.1.2.4 unique_ptr наблюдатели [unique.ptr.single.observers]
typename add_lvalue_reference<T>::type operator*() const;
1 Requires: get() != nullptr.
2 Returns: *get().
pointer operator->() const noexcept;
3 Requires: get() != nullptr.
4 Returns: get().
5 Note: use typically requires that T be a complete type.
Вы можете видеть, что operator*
(разыменование) не указывается как noexcept
, возможно, потому что это может вызвать segfault, но затем operator->
на том же объекте указывается как noexcept
. Требования для обоих одинаковы, однако существует разница в спецификации исключений.
Я заметил, что у них разные типы возвращаемых значений, один возвращает указатель, а другой - ссылку. Является ли это утверждением, что operator->
на самом деле ничего не делает различий?
Дело в том, что с помощью operator->
на указателе любого типа, который является NULL, будет segfault (это UB). Почему тогда один из них указан как noexcept
, а другой нет?
Я уверен, что кое-что упустил.
EDIT:
Глядя на std::shared_ptr
, мы имеем следующее:
20.7.2.2.5 наблюдатели shared_ptr [util.smartptr.shared.obs]
T& operator*() const noexcept;
T* operator->() const noexcept;
Это не то же самое? Это имеет какое-либо отношение к разной семантике собственности?