diff --git a/proxy.h b/proxy.h index a7321ff4..c36d52ee 100644 --- a/proxy.h +++ b/proxy.h @@ -704,6 +704,7 @@ class proxy : public details::facade_traits::direct_accessor { } bool has_value() const noexcept { return meta_.has_value(); } + explicit operator bool() const noexcept { return meta_.has_value(); } void reset() noexcept(F::constraints.destructibility >= constraint_level::nothrow) requires(F::constraints.destructibility >= constraint_level::nontrivial) @@ -759,6 +760,11 @@ class proxy : public details::facade_traits::direct_accessor { auto&& operator*() const&& noexcept requires(_Traits::has_indirection) { return std::forward(ia_); } + friend void swap(proxy& lhs, proxy& rhs) noexcept(noexcept(lhs.swap(rhs))) + { lhs.swap(rhs); } + friend bool operator==(const proxy& lhs, std::nullptr_t) noexcept + { return !lhs.has_value(); } + private: template P& initialize(Args&&... args) { @@ -821,9 +827,6 @@ template const R& proxy_reflect(const proxy& p) noexcept { return details::proxy_helper::get_meta(p); } -template -void swap(proxy& a, proxy& b) noexcept(noexcept(a.swap(b))) { a.swap(b); } - namespace details { template diff --git a/tests/proxy_lifetime_tests.cpp b/tests/proxy_lifetime_tests.cpp index 90466c39..66271676 100644 --- a/tests/proxy_lifetime_tests.cpp +++ b/tests/proxy_lifetime_tests.cpp @@ -748,6 +748,29 @@ TEST(ProxyLifetimeTests, TestHasValue) { ASSERT_EQ(ToString(*p1), "123"); } +TEST(ProxyLifetimeTests, TestOperatorBool) { + // Implicit conversion to bool shall be prohibited. + static_assert(!std::is_nothrow_convertible_v, bool>); + + int foo = 123; + pro::proxy p1; + ASSERT_FALSE(static_cast(p1)); + p1 = &foo; + ASSERT_TRUE(static_cast(p1)); + ASSERT_EQ(ToString(*p1), "123"); +} + +TEST(ProxyLifetimeTests, TestEqualsToNullptr) { + int foo = 123; + pro::proxy p1; + ASSERT_TRUE(p1 == nullptr); + ASSERT_TRUE(nullptr == p1); + p1 = &foo; + ASSERT_TRUE(p1 != nullptr); + ASSERT_TRUE(nullptr != p1); + ASSERT_EQ(ToString(*p1), "123"); +} + TEST(ProxyLifetimeTests, TestReset_FromValue) { utils::LifetimeTracker tracker; std::vector expected_ops;