C++重载运算符、常量参数还是传递值


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);
}

因此,问题的重点是,当我可以让语言自动为我(函数1(提供便利时,为什么我需要显式地创建一个临时变量(函数2(?

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的副本,它是一个局部变量。

两者都可以正常工作,但不同之处在于创建的副本数量。你在第1种情况下复制的比第2种情况下多。

尽管第二个将针对tmp变量进行优化,以使用移动语义来减少副本。所以在第二种情况下的性能会更快

最新更新