簡體   English   中英

C++ 重載運算符,常量參數還是按值傳遞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM