다음 코드에서 &&
을 사용하면 어떤 점이 좋습니까? 코드는 this 질문에서 Specialize same operator for different traits이 코드에서 &&의 이점은 무엇입니까?
에 대답에서이다, 나는 &&
인수가 함수에 의해 수정 될 수있는 참조입니다 의미 얻을. here 바와 같이
decay_t
std::forward
같이 어레이로서 변수에 대한 참조를 해석하도록 컴파일러 방지 완벽 전달된다. 왜 포워딩이 필요한가요?
감사합니다.
#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에 모두 바인딩하고,'std :: forward'에 전달 된'T1'은 그 객체가 원래의 lvalue인지 rvalue인지에 대한 정보를 담고 있습니다. 즉,'&&'의 "장점"은 완벽한 전달을 허용한다는 것입니다. – KABoissonneault
그래서 모든 것이 완벽한 전달을 허용하는 것입니다 ... 이것은 또한 'T1 && Bb' 인수의 임시 복사본을 만드는 것을 피합니까? – rxu
@rxu : 전달 된 함수 (또는 연산자 과부하)가 값으로 인수를 받거나 전달 참조에 의해 전달 방식으로 전달되지 않는 한 복사본을 만들지 않습니다. – ShadowRanger