Почему оператор присваивания перемещения вызывается для аргумента lvalue? - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я делаю некоторую отладку в нашем классе Variant. Может кто-нибудь объяснить, почему компилятор выбирает оператор присваивания перемещения в этом конкретном случае? Поскольку testValue является lvalue, я ожидаю, что компилятор выберет назначение копирования ... 1

template <typename T, typename... TN>
template <typename U>
Variant<T, TN...>& Variant<T, TN...>::operator = (U&& a_Value)
{
    // Move value ...
}

template <typename T, typename... TN>
template <typename U, typename... UN>
Variant<T, TN...>& Variant<T, TN...>::operator = (const Variant<U, UN...>& a_Variant)
{
    // Copy data...
}

std::string testValue("test");
Variant<char32_t, std::string> var;
var = testValue; // testValue now becomes empty string

https://en.cppreference.com/w/cpp/language/move_assignment

1 Ответ

0 голосов
/ 30 августа 2018

(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 ...
}
...