В следующем коде, в чем преимущество использования &&
? Код от ответа на Specialize same operator for different traitsВ чем преимущество && в этом коде?
this От вопроса, я получаю что &&
аргумент означает, что это ссылка, которая может быть изменена с помощью функции.
The 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)
}
'&&' в этом коде полуформально называют ссылками пересылки. Они связываются как с lvalues, так и с rvalues, а 'T1', переданный в' std :: forward', содержит информацию о том, был ли объект изначально значением lvalue или rvalue. Короче говоря, «преимущество» «&&» заключается в том, что он позволяет совершенную пересылку. – KABoissonneault
Итак, все, что нужно для идеальной пересылки ... Это также позволяет избежать создания временной копии любой части аргумента 'T1 && Bb'? – rxu
@rxu: он не будет создавать копию, если функция (или перегрузка оператора) не была переадресована на прием аргумента по значению (или путем пересылки ссылки, а затем сама использует его по методу «проход по значению»). – ShadowRanger