Qt::totally_ordered_wrapper: do not allow operator*() for void*

Disable operator*() for void* type, because it otherwise causes
a compiler error:

  qcomparehelpers.h:1103:18: error: forming reference to void
     constexpr T& operator*() const noexcept { return *get(); }
                  ^~~~~~~~

Use this as an opportunity to add more tests for operator*().

Amends ece36a7394594ede3fba6744fb8f5b450a477652.

Change-Id: I205b9989bd142ca9aa49f8f4d15854e591e3042b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit 053b8ff7fedfe5aed29a91a82569c00cac466e9a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ivan Solovev 2024-08-09 18:57:06 +02:00 committed by Qt Cherry-pick Bot
parent 74e50e224f
commit c197fefb22
2 changed files with 13 additions and 1 deletions

View File

@ -775,7 +775,8 @@ public:
constexpr P get() const noexcept { return ptr; } constexpr P get() const noexcept { return ptr; }
constexpr void reset(P p) noexcept { ptr = p; } constexpr void reset(P p) noexcept { ptr = p; }
constexpr P operator->() const noexcept { return get(); } constexpr P operator->() const noexcept { return get(); }
constexpr T& operator*() const noexcept { return *get(); } template <typename U = T, std::enable_if_t<!std::is_void_v<U>, bool> = true>
constexpr U &operator*() const noexcept { return *get(); }
explicit constexpr operator bool() const noexcept { return get(); } explicit constexpr operator bool() const noexcept { return get(); }

View File

@ -66,4 +66,15 @@ void tst_QCompareHelpers::totallyOrderedWrapperBasics()
Qt::totally_ordered_wrapper<int*> pi; // partially-formed Qt::totally_ordered_wrapper<int*> pi; // partially-formed
pi = nullptr; pi = nullptr;
QCOMPARE_EQ(pi.get(), nullptr); QCOMPARE_EQ(pi.get(), nullptr);
// Test that we can create a wrapper for void*.
[[maybe_unused]] constexpr Qt::totally_ordered_wrapper<void*> voidWrp{nullptr};
// test that operator*() works
int val = 10;
Qt::totally_ordered_wrapper<int*> intWrp{&val};
QCOMPARE_EQ(*intWrp, 10);
*intWrp = 20;
QCOMPARE_EQ(*intWrp, 20);
QCOMPARE_EQ(val, 20);
} }