template <typename T>
T operator+(T a, const T& b) {
a += b;
return a;
}
template <typename T>
T operator+(const T& a, const T& b) {
T tmp {a};
tmp += b;
return tmp;
}
有什么理由让你像第二个函数一样将参数作为常量引用传递,而不是像第一个函数那样直接按值传递,因为无论如何你都需要一个临时变量?
编辑1:
我想我应该提到,这两个函数替代仅用于处理带有左值参数的情况,并且我将提供另外两个函数来处理右值参数,如下所示。
template <typename T>
T operator+(T&& a, const T& b) {
a += b;
return std::move(a);
}
template <typename T>
T operator+(const T& a, T&& b) {
b += a;
return std::move(b);
}
所以问题的重点是,为什么我需要显式创建一个临时变量(函数 2),而我可以让语言自动为我提供便利(函数 1)?
最佳答案
template <typename T>
T operator+(T a, const T& b) {
a += b;
return a;
}
在这里,您将创建变量a的拷贝,该拷贝将传入此处,然后您将更新拷贝。这需要创建三个拷贝,并且您再次按值返回。
template <typename T>
T operator+(const T& a, const T& b) {
T tmp {a};
tmp += b;
return tmp;
}
在这里,您的tmp变量具有本地作用域,并且变量a是const引用,因此不允许修改a的值。 并且您将返回 temp 的拷贝,它是一个局部变量。
两者都工作正常,但区别在于创建的拷贝数量。您在第一种情况下复制的拷贝数量多于第二种情况。
尽管第二个将针对 tmp 变量进行优化,以使用移动语义来减少拷贝。所以在第二种情况下你会有更快的性能
关于C++ 重载运算符、常量参数还是按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65508006/