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 > template< typename T >
typename std::enable_if< typename std::enable_if<
!std::is_same< detail::conjunction<
operator_brackets_proxy< Iterator >, detail::negation<
typename std::remove_cv< typename std::remove_reference< T >::type >::type std::is_same<
operator_brackets_proxy< Iterator >,
typename std::remove_cv< typename std::remove_reference< T >::type >::type
>
>,
std::is_assignable< reference, T&& >
>::value, >::value,
operator_brackets_proxy& 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); *m_iter = static_cast< T&& >(val);
return *this; return *this;