not_null constructor is now explicit (#659)

solves #395
This commit is contained in:
ericLemanissier 2018-04-25 04:11:43 +02:00 committed by Anna Gringauze
parent fbe867a9c4
commit 2fc94db3eb
2 changed files with 7 additions and 7 deletions

View File

@ -72,7 +72,7 @@ public:
static_assert(std::is_assignable<T&, std::nullptr_t>::value, "T cannot be assigned nullptr."); static_assert(std::is_assignable<T&, std::nullptr_t>::value, "T cannot be assigned nullptr.");
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>> template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
constexpr not_null(U&& u) : ptr_(std::forward<U>(u)) constexpr explicit not_null(U&& u) : ptr_(std::forward<U>(u))
{ {
Expects(ptr_ != nullptr); Expects(ptr_ != nullptr);
} }

View File

@ -178,10 +178,10 @@ TEST_CASE("TestNotNullCasting")
MyBase base; MyBase base;
MyDerived derived; MyDerived derived;
Unrelated unrelated; Unrelated unrelated;
not_null<Unrelated*> u = &unrelated; not_null<Unrelated*> u{&unrelated};
(void) u; (void) u;
not_null<MyDerived*> p = &derived; not_null<MyDerived*> p{&derived};
not_null<MyBase*> q = &base; not_null<MyBase*> q(&base);
q = p; // allowed with heterogeneous copy ctor q = p; // allowed with heterogeneous copy ctor
CHECK(q == p); CHECK(q == p);
@ -192,18 +192,18 @@ TEST_CASE("TestNotNullCasting")
not_null<Unrelated*> r = p; not_null<Unrelated*> r = p;
not_null<Unrelated*> s = reinterpret_cast<Unrelated*>(p); not_null<Unrelated*> s = reinterpret_cast<Unrelated*>(p);
#endif #endif
not_null<Unrelated*> t = reinterpret_cast<Unrelated*>(p.get()); not_null<Unrelated*> t(reinterpret_cast<Unrelated*>(p.get()));
CHECK(reinterpret_cast<void*>(p.get()) == reinterpret_cast<void*>(t.get())); CHECK(reinterpret_cast<void*>(p.get()) == reinterpret_cast<void*>(t.get()));
} }
TEST_CASE("TestNotNullAssignment") TEST_CASE("TestNotNullAssignment")
{ {
int i = 12; int i = 12;
not_null<int*> p = &i; not_null<int*> p(&i);
CHECK(helper(p)); CHECK(helper(p));
int* q = nullptr; int* q = nullptr;
CHECK_THROWS_AS(p = q, fail_fast); CHECK_THROWS_AS(p = not_null<int*>(q), fail_fast);
} }
TEST_CASE("TestNotNullRawPointerComparison") TEST_CASE("TestNotNullRawPointerComparison")