Dans la norme C++ projet (N3485), il stipule ce qui suit:
20.7.1.2.4 unique_ptr observateurs [unique.ptr.unique.les observateurs]
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.
Vous pouvez voir qu' operator*
(déréférencement) n'est pas spécifié comme noexcept
, probablement parce qu'il peut provoquer une erreur de segmentation, mais alors operator->
sur le même objet est spécifié en tant que noexcept
. Les exigences pour les deux sont les mêmes, il existe toutefois une différence dans la spécification d'exception.
J'ai remarqué qu'ils ont différents types de retour, on renvoie un pointeur et l'autre une référence. Est que le fait de dire qu' operator->
ne fait pas de déréférencement de quoi que ce soit?
Le fait de la question est que l'utilisation d' operator->
sur un pointeur de toute nature, qui est NULLE, sera l'erreur de segmentation (UB). Pourquoi, alors, est l'un de ces spécifié en tant que noexcept
et l'autre pas?
Je suis sûr que j'ai oublié quelque chose.
EDIT:
En regardant std::shared_ptr
nous avons ceci:
20.7.2.2.5 shared_ptr observateurs [util.smartptr.partagé.obs]
T& operator*() const noexcept;
T* operator->() const noexcept;
Ce n'est pas la même chose? N'ayant rien à voir avec l'appropriation différente de la sémantique?