[英]C++ overloading operator, constant parameter or pass by value?
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;
}
有什么理由像第二個 function 那樣將參數作為常量引用傳遞,而不是像第一個 function 那樣直接按值傳遞,因為無論如何您都需要一個臨時變量?
編輯1:
我想我應該提一下,這兩個函數替代只是用於處理左值 arguments 的情況,我將提供另外兩個函數來處理右值 arguments,如下所示。
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變量具有本地 scope 並且變量a是 const 引用,因此不允許修改a的值。 你正在返回一個temp的副本,它是一個局部變量。
兩者都可以正常工作,但不同之處在於創建的副本數量。 您在第一種情況下制作的副本比在第二種情況下要多。
盡管第二個將針對tmp變量進行優化以使用移動語義以減少副本。 所以你在第二種情況下會有更快的表現
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.