为什么为lvalue参数调用了move-assignment运算符?

问题描述 投票:0回答:1

我正在对Variant类进行一些调试。有人可以解释为什么编译器会在这种特殊情况下选择移动赋值运算符吗?由于testValue是左值,我希望编译器选择复制赋值... 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

c++ move-semantics assignment-operator variant rvalue
1个回答
2
投票

(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 ...
}
© www.soinside.com 2019 - 2024. All rights reserved.