@@ -61,14 +61,14 @@ class observer_ptr {
6161 " Template parameter T cannot be void"
6262 );
6363public:
64- using element_type = std::remove_extent_t <T>;
64+ using element_type = std::remove_extent_t <T>;
6565
6666 // Default constructor: initialize to nullptr
6767 constexpr observer_ptr () noexcept : ptr(nullptr ) {}
6868 constexpr observer_ptr (std::nullptr_t ) noexcept : ptr(nullptr ) {}
6969
7070 // Constructor from raw pointer (implicit conversions allowed)
71- constexpr observer_ptr (T* p) noexcept : ptr(p) {}
71+ constexpr explicit observer_ptr (T* p) noexcept : ptr(p) {}
7272
7373 // Copy constructor and assignment
7474 constexpr observer_ptr (const observer_ptr&) noexcept = default;
@@ -160,39 +160,47 @@ class observer_ptr {
160160
161161// Free function for dynamic casting observer_ptr<B> to observer_ptr<A>
162162template <class T , class U >
163- observer_ptr<T> dynamic_observer_cast (const observer_ptr<U>& r) noexcept
163+ inline observer_ptr<T>
164+ dynamic_observer_cast (const observer_ptr<U>& r) noexcept
164165{
165- if (auto p = dynamic_cast <typename observer_ptr<T>::element_type*>(r.get ()))
166- return observer_ptr<T>(r);
167- else
168- return observer_ptr<T>{nullptr };
166+ auto * p = dynamic_cast <typename observer_ptr<T>::element_type*>(r.get ());
167+
168+ if (p) return observer_ptr<T>(p);
169+
170+ return observer_ptr<T>{nullptr };
169171}
170172
171173template <class T , class U >
172- observer_ptr<const T> dynamic_observer_cast (const observer_ptr<const U>& r) noexcept
174+ inline observer_ptr<const T>
175+ dynamic_observer_cast (const observer_ptr<const U>& r) noexcept
173176{
174- if (auto p = dynamic_cast <const typename observer_ptr<const T>::element_type*>(r.get ()))
175- return observer_ptr<const T>(p);
176- else
177- return observer_ptr<const T>{nullptr };
178- }
177+ const auto * p = dynamic_cast <const typename observer_ptr<const T>::element_type*>(r.get ());
178+
179+ if (p) return observer_ptr<const T>(p);
180+
181+ return observer_ptr<const T>{nullptr };
182+ }
179183
180184template <class T , class U >
181- observer_ptr<T> static_observer_cast (const observer_ptr<U>& r) noexcept
185+ inline observer_ptr<T>
186+ static_observer_cast (const observer_ptr<U>& r) noexcept
182187{
183- if (auto p = static_cast <typename observer_ptr<T>::element_type*>(r.get ()))
184- return observer_ptr<T>(r);
185- else
186- return observer_ptr<T>{nullptr };
188+ auto * p = static_cast <typename observer_ptr<T>::element_type*>(r.get ());
189+
190+ if (p) return observer_ptr<T>(p);
191+
192+ return observer_ptr<T>{nullptr };
187193}
188194
189195template <class T , class U >
190- observer_ptr<const T> static_observer_cast (const observer_ptr<const U>& r) noexcept
196+ inline observer_ptr<const T>
197+ static_observer_cast (const observer_ptr<const U>& r) noexcept
191198{
192- if (auto p = static_cast <const typename observer_ptr<const T>::element_type*>(r.get ()))
193- return observer_ptr<const T>(p);
194- else
195- return observer_ptr<const T>{nullptr };
199+ const auto * p = static_cast <const typename observer_ptr<const T>::element_type*>(r.get ());
200+
201+ if (p) return observer_ptr<const T>(p);
202+
203+ return observer_ptr<const T>{nullptr };
196204}
197205
198206// Non-member swap
0 commit comments