}; // observer_ptr<>
template<typename _Tp>
- void
+ constexpr void
swap(observer_ptr<_Tp>& __p1, observer_ptr<_Tp>& __p2) noexcept
{
__p1.swap(__p2);
}
template<typename _Tp>
- observer_ptr<_Tp>
+ constexpr observer_ptr<_Tp>
make_observer(_Tp* __p) noexcept
{
return observer_ptr<_Tp>(__p);
}
template<typename _Tp, typename _Up>
- bool
+ constexpr bool
operator==(observer_ptr<_Tp> __p1, observer_ptr<_Up> __p2)
{
return __p1.get() == __p2.get();
}
template<typename _Tp, typename _Up>
- bool
+ constexpr bool
operator!=(observer_ptr<_Tp> __p1, observer_ptr<_Up> __p2)
{
return !(__p1 == __p2);
}
template<typename _Tp>
- bool
+ constexpr bool
operator==(observer_ptr<_Tp> __p, nullptr_t) noexcept
{
return !__p;
}
template<typename _Tp>
- bool
+ constexpr bool
operator==(nullptr_t, observer_ptr<_Tp> __p) noexcept
{
return !__p;
}
template<typename _Tp>
- bool
+ constexpr bool
operator!=(nullptr_t, observer_ptr<_Tp> __p) noexcept
{
return bool(__p);
}
template<typename _Tp, typename _Up>
- bool
+ constexpr bool
operator<(observer_ptr<_Tp> __p1, observer_ptr<_Up> __p2)
{
return std::less<typename common_type<typename add_pointer<_Tp>::type,
}
template<typename _Tp, typename _Up>
- bool
+ constexpr bool
operator>(observer_ptr<_Tp> __p1, observer_ptr<_Up> __p2)
{
return __p2 < __p1;
}
template<typename _Tp, typename _Up>
- bool
+ constexpr bool
operator<=(observer_ptr<_Tp> __p1, observer_ptr<_Up> __p2)
{
return !(__p2 < __p1);
}
template<typename _Tp, typename _Up>
- bool
+ constexpr bool
operator>=(observer_ptr<_Tp> __p1, observer_ptr<_Up> __p2)
{
return !(__p1 < __p2);
#include <experimental/memory>
#include <testsuite_hooks.h>
-int main()
+constexpr bool test()
{
const int i = 42;
auto o = std::experimental::make_observer(&i);
static_assert( std::is_same<decltype(o),
- std::experimental::observer_ptr<const int>>(), "" );
+ std::experimental::observer_ptr<const int>>(), "" );
VERIFY( o && *o == 42 );
VERIFY( o.get() == &i );
+ return true;
+}
+
+int main()
+{
+ test();
+ static_assert( test(), "LWG 4295 - make_observer should be constexpr" );
}
using std::experimental::observer_ptr;
-void test01()
+constexpr void test01()
{
observer_ptr<int> a, b;
VERIFY(a == b);
}
-void test02()
+constexpr void test02()
{
int x[2]{};
observer_ptr<int> a{&x[0]};
VERIFY(b > a);
}
-void test03()
+constexpr void test03()
{
int x{};
observer_ptr<int> a{&x};
VERIFY(a == b);
}
-void test04()
+int x[2]{};
+
+constexpr void test04()
{
- static constexpr int x[2]{};
constexpr observer_ptr<const int> a{&x[0]};
constexpr observer_ptr<const int> b{&x[1]};
VERIFY(a != b);
VERIFY(b > a);
}
-void test05()
+constexpr void test05()
{
- static constexpr int x{};
- constexpr observer_ptr<const int> a{&x};
- constexpr observer_ptr<const int> b{&x};
+ constexpr observer_ptr<const int> a{&x[0]};
+ constexpr observer_ptr<const int> b{&x[0]};
VERIFY(a == b);
}
-
-int main()
+constexpr bool all_tests()
{
test01();
test02();
test03();
test04();
test05();
+ return true;
+}
+
+int main()
+{
+ all_tests();
+ static_assert( all_tests(), "LWG 4295 - relops should be constexpr" );
}