Disable operator_brackets_proxy assignment if reference is not assignable.

Use SFINAE to disable operator_brackets_proxy assignment operator is reference
is not assignable from the assignment argument. Also fix the iterator type
in std::declval in noexcept specification.
This commit is contained in:
Andrey Semashev
2025-06-09 11:59:05 +03:00
parent e968c3312b
commit 01ac4e1a47

View File

@ -360,12 +360,17 @@ public:
template< typename T >
typename std::enable_if<
!std::is_same<
operator_brackets_proxy< Iterator >,
typename std::remove_cv< typename std::remove_reference< T >::type >::type
detail::conjunction<
detail::negation<
std::is_same<
operator_brackets_proxy< Iterator >,
typename std::remove_cv< typename std::remove_reference< T >::type >::type
>
>,
std::is_assignable< reference, T&& >
>::value,
operator_brackets_proxy&
>::type operator= (T&& val) noexcept(noexcept(*std::declval< Iterator const& >() = std::declval< T&& >()))
>::type operator= (T&& val) noexcept(noexcept(*std::declval< Iterator& >() = std::declval< T&& >()))
{
*m_iter = static_cast< T&& >(val);
return *this;