运算符重载、右值、C++

Operator overloading, Rvalues, C++

考虑一个结构

template<typename T, size_t N>
struct Something {
    std::array<T,N> args;

    // Some constructors

};

现在让我们为 Something<T> 重载 = 运算符。事实上,我可以通过两种方式实现它。

第一种方式

Something& operator=(const Something& rhs){
    // an implementation with copy semantics
}

Something& operator=(Something&& rhs) {
    // an implementation with move semantics
}

第二种方式

Something& operator=(Something rhs){
    // implement with move semantics
}

所以,我的问题是最标准的方法最优化的方法是什么首先方式第二种方式?

对于这种特殊情况,您不应实施赋值运算符。编译器已经为你做了:

#include <array>
#include <cstddef>

template<typename T, size_t N>
struct Something {
    std::array<T,N> args;
};

int main() {
    Something<int,42> a;
    Something<int,42> b;
    a = b;
}

Demo

对于一般情况,我建议您参考 What are the basic rules and idioms for operator overloading?。并考虑到并非所有东西都可以移动,也不是所有东西都可以复制。此外,有时一步只是复制。因此,这取决于。