diff --git a/universal/include/userver/utils/impl/transparent_hash.hpp b/universal/include/userver/utils/impl/transparent_hash.hpp index 54a6039b999d..b99c6b9951de 100644 --- a/universal/include/userver/utils/impl/transparent_hash.hpp +++ b/universal/include/userver/utils/impl/transparent_hash.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #if defined(USERVER_IMPL_ORIGINAL_CXX_STANDARD) @@ -85,7 +86,7 @@ template auto* FindTransparentOrNullptr(TransparentMap&& map, const Key& key) { static_assert(!std::is_rvalue_reference_v, "Dangling"); const auto iterator = FindTransparent(map, key); - return iterator == map.end() ? nullptr : &iterator->second; + return iterator == map.end() ? nullptr : std::addressof(iterator->second); } template diff --git a/universal/src/utils/impl/transparent_hash_test.cpp b/universal/src/utils/impl/transparent_hash_test.cpp index 6f96ead5c2c1..8b4ce40e1fa9 100644 --- a/universal/src/utils/impl/transparent_hash_test.cpp +++ b/universal/src/utils/impl/transparent_hash_test.cpp @@ -86,6 +86,21 @@ TEST(TransparentMap, FindTransparentOrNullptr) { EXPECT_EQ(FindTransparentOrNullptr(const_map, "bar"), nullptr); } +TEST(TransparentMap, FindTransparentOrNullptrAddressof) { + struct Overloaded { + bool used = false; + auto operator&() { + used = true; + return this; + }; + }; + + utils::impl::TransparentMap m{{{"1"}, {.used = false}}}; + const auto* ptr = FindTransparentOrNullptr(m, "1"); + ASSERT_TRUE(ptr); + EXPECT_FALSE(ptr->used); +} + TEST(TransparentMap, CustomValue) { using Map = utils::impl::TransparentMap; static_assert(meta::IsUniqueMap);