【发布时间】:2020-12-30 13:47:13
【问题描述】:
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:
我想我应该提一下,这 2 个替代函数仅用于处理带有左值参数的大小写,并且我将提供另外 2 个用于处理右值参数的函数,如下所示。
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)?
【问题讨论】:
-
考虑
a + b + c。当你通过值传递第一个参数时,你可以从a + b临时移动,当你通过const-ref传递时,你不能。 -
我个人更喜欢第一种方法。也就是说,如果性能真的很关键,你应该对你的用例进行基准测试,看看哪个最适合你。
标签: c++ operator-overloading parameter-passing