繁体   English   中英

为什么为左值参数调用移动分配运算符?

[英]Why is move-assignment operator invoked for lvalue argument?

我目前正在对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://zh.cppreference.com/w/cpp/language/move_assignment

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM