为什么要为左值参数调用移动赋值运算符?
Why is move-assignment operator invoked for lvalue argument?
我目前正在对我们的 Variant class 进行一些调试。
有人可以解释为什么编译器 select 在这种特殊情况下使用移动赋值运算符吗?由于 testValue
是左值,我希望编译器 select 复制赋值... 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
(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 ...
}
我目前正在对我们的 Variant class 进行一些调试。
有人可以解释为什么编译器 select 在这种特殊情况下使用移动赋值运算符吗?由于 testValue
是左值,我希望编译器 select 复制赋值... 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
(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 ...
}