在下面的代碼中,使用&&
有什麼好處? 該代碼是從答案在Specialize same operator for different traits這段代碼中&&的優點是什麼?
從this問題,我得到一個&&
參數意味着它是一個可以由該函數修改的參考。
的decay_t
可能阻止編譯器解釋的變量作爲數組的引用,如在What is std::decay and when it should be used?
std::forward
是如所描述的here完美轉發。爲什麼我們需要這個轉發?
謝謝。
#include <iostream>
#include <type_traits>
#include<utility>
class A;
template <typename T>
struct is_A : std::false_type {};
template <> struct is_A<A> : std::true_type {};
template <typename T>
struct is_int : std::false_type {};
template <> struct is_int<int> : std::true_type {};
template <> struct is_int<long> : std::true_type {};
class A{
public:
int val;
void print(void){
std::cout << val << std::endl;
}
template <typename T1>
std::enable_if_t<is_int<std::decay_t<T1>>::value, void>
operator=(T1 && input){
val = 2*std::forward<T1>(input);
}
template <typename T1>
std::enable_if_t<is_A<std::decay_t<T1>>::value,void>
operator=(T1 && Bb){
val = 5*std::forward<T1>(Bb).val;
}
};
int main(void){
A Aa;
A Bb;
int in_a = 3;
Aa = in_a;
Bb = Aa;
Aa.print(); //This should give 6. (3x2)
Bb.print(); //This should give 30. (6x5)
}
此代碼中的'&&'半正式地稱爲轉發引用。它們綁定到左值和右值,並且傳遞給'std :: forward'的'T1'包含關於對象最初是左值還是右值的信息。總之,'&&'的「優勢」在於它可以完美轉發。 – KABoissonneault
所以整個事情就是讓完美的轉發......這是否也避免創建任何'T1 && Bb'參數的任何部分的臨時副本? – rxu
@rxu:它不會創建一個副本,除非它被轉發的函數(或運算符重載)通過值接收參數(或通過轉發引用,然後它本身以傳值方式使用它)。 – ShadowRanger