diff --git a/c10/test/util/MaybeOwned_test.cpp b/c10/test/util/MaybeOwned_test.cpp index eb67aa349e24..ea415eec456d 100644 --- a/c10/test/util/MaybeOwned_test.cpp +++ b/c10/test/util/MaybeOwned_test.cpp @@ -35,6 +35,17 @@ TEST(MaybeOwnedTest, SimpleDereferencingString) { EXPECT_EQ(owned2->size(), x.size()); } +TEST(MaybeOwnedTest, DefaultCtorInt) { + int x = 123; + MaybeOwned borrowed, owned; + borrowed = MaybeOwned::borrowed(x); + owned = MaybeOwned::owned(c10::in_place, x); + EXPECT_EQ(*borrowed, x); + EXPECT_EQ(*owned, x); + EXPECT_EQ(&*borrowed, &x); + EXPECT_NE(&*owned, &x); +} + TEST(MaybeOwnedTest, MoveConstructor) { std::string x = "hello"; auto borrowed = MaybeOwned::borrowed(x); diff --git a/c10/util/MaybeOwned.h b/c10/util/MaybeOwned.h index 30031cdaabf7..8db5954eadcf 100644 --- a/c10/util/MaybeOwned.h +++ b/c10/util/MaybeOwned.h @@ -37,7 +37,7 @@ class MaybeOwned final { , own_(std::forward(args)...) {} public: - + explicit MaybeOwned(): isBorrowed_(true), borrow_(nullptr) {} MaybeOwned(const MaybeOwned&) = delete; MaybeOwned& operator=(const MaybeOwned&) = delete; @@ -91,10 +91,16 @@ class MaybeOwned final { } const T& operator*() const { + if (isBorrowed_) { + TORCH_INTERNAL_ASSERT_DEBUG_ONLY(borrow_ != nullptr); + } return isBorrowed_ ? *borrow_ : own_; } const T* operator->() const { + if (isBorrowed_) { + TORCH_INTERNAL_ASSERT_DEBUG_ONLY(borrow_ != nullptr); + } return isBorrowed_ ? borrow_ : &own_; } };