(U&& a_Value)
- это не ссылка на значение, а ссылка на пересылку.
U
выводится как std::string&
в вашем случае.
Назначение перемещения будет выглядеть примерно так:
template <typename T, typename... TN>
Variant<T, TN...>& Variant<T, TN...>::operator = (Variant<T, TN...>&& rhs)
{
// Move value ...
}
или
template <typename T, typename... TN>
template <typename U, typename... UN>
Variant<T, TN...>& Variant<T, TN...>::operator = (Variant<U, UN...>&& rhs)
{
// Move value ...
}