c++ - 为什么要为左值参数调用 move 赋值运算符?

标签 c++ move-semantics assignment-operator variant rvalue

我目前正在对我们的 Variant 类进行一些调试。 有人可以解释为什么编译器在这种特殊情况下选择 move 赋值运算符吗?由于 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

最佳答案

(U&& a_Value) 不是右值引用,而是转发引用。

U 在您的情况下推断为 std::string&

move 分配类似于:

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

关于c++ - 为什么要为左值参数调用 move 赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52095869/

相关文章:

multithreading - 有没有办法让 Rust 闭包只将一些变量移入其中?

rust - 为什么在 Rust 元组模式匹配中需要显式借用?

c++ - 结合声明和初始化与重载 `=`

c - 如何计算 --/++ 的值

c++ - 什么是三法则?

c++ - 如何在 C++ 中过滤字符串 vector ?

c++ - 具有返回条件的openmp优化

c++ - 如何抑制 g++ 中的特定警告

C++:从 MIDI 消息中获取数据 (DWORD)

c++ - 我可以从 vector 的开头 move 对象吗?为什么不?