C++ 標準ドラフト (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*
(dereference) が として指定されていないことがわかりますnoexcept
。これはおそらく segfault を引き起こす可能性があるためですがoperator->
、同じオブジェクトで が として指定されていnoexcept
ます。両方の要件は同じですが、例外仕様に違いがあります。
戻り値の型が異なることに気付きました.1つはポインターを返し、もう1つは参照を返します。operator->
それは実際には何も逆参照しないということですか?
問題は、operator->
NULL である任意の種類のポインターを使用すると、segfault (UB) が発生することです。では、なぜこれらの 1 つが指定されnoexcept
、もう 1 つが指定されていないのでしょうか。
私は何かを見落としていると確信しています。
編集:
これを見ると、次のようになりstd::shared_ptr
ます。
20.7.2.2.5 shared_ptr オブザーバー [util.smartptr.shared.obs]
T& operator*() const noexcept;
T* operator->() const noexcept;
それは同じではありませんか?それは、異なる所有権のセマンティクスと関係がありますか?