Why does [std::is_move_assignable] not behave as expected?
<pre><code>#include &lt;unordered_map&gt;
#include &lt;type_traits&gt;

int main()
{
        std::unordered_multimap&lt;int, string&gt; m{ { 1, "hello" } };
        auto b = std::is_move_assignable_v&lt;decltype(*m.begin())&gt;;
        // b is true

        auto v = *m4.begin(); // ok
        v = std::move(*m4.begin()); // compile-time error
}
</code></pre>

<p><strong>Issue:</strong></p>

<blockquote>
  <p>If <code>b</code> is true, then <code>v = *m4.begin();</code> should be ok.</p>
</blockquote>

<p><strong>Question:</strong></p>

<blockquote>
  <p>Why does <code>std::is_move_assignable</code> not behave as expected?</p>
</blockquote>

<p><strong>Error messages: (Clang 3.8 + Visual Studio 2015 Update 3)</strong></p>

<blockquote>
<pre><code>error : cannot assign to non-static data member 'first' with
const-qualified type 'const int'
              first = _Right.first;
              ~~~~~ ^

main.cpp(119,5) :  note: in instantiation of member function
'std::pair&lt;const int, std::basic_string&lt;char, std::char_traits&lt;char&gt;,
std::allocator&lt;char&gt; &gt; &gt;::operator=' requested here
              v = *m4.begin(); // error
</code></pre>
</blockquote>