运算符重载、右值、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;
}
对于一般情况,我建议您参考 What are the basic rules and idioms for operator overloading?。并考虑到并非所有东西都可以移动,也不是所有东西都可以复制。此外,有时一步只是复制。因此,这取决于。
考虑一个结构
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;
}
对于一般情况,我建议您参考 What are the basic rules and idioms for operator overloading?。并考虑到并非所有东西都可以移动,也不是所有东西都可以复制。此外,有时一步只是复制。因此,这取决于。