2016-09-16 2 views
4

다음 코드에서 &&을 사용하면 어떤 점이 좋습니까? 코드는 this 질문에서 Specialize same operator for different traits이 코드에서 &&의 이점은 무엇입니까?

에 대답에서이다, 나는 && 인수가 함수에 의해 수정 될 수있는 참조입니다 의미 얻을. here 바와 같이

decay_t

아마 What is std::decay and when it should be used?

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) 
} 
+2

이 코드에서 '&&'는 준 공식적으로 전달 참조라고합니다. 그들은 lvalues와 rvalues에 모두 바인딩하고,'std :: forward'에 전달 된'T1'은 그 객체가 원래의 lvalue인지 rvalue인지에 대한 정보를 담고 있습니다. 즉,'&&'의 "장점"은 완벽한 전달을 허용한다는 것입니다. – KABoissonneault

+1

그래서 모든 것이 완벽한 전달을 허용하는 것입니다 ... 이것은 또한 'T1 && Bb' 인수의 임시 복사본을 만드는 것을 피합니까? – rxu

+1

@rxu : 전달 된 함수 (또는 연산자 과부하)가 값으로 인수를 받거나 전달 참조에 의해 전달 방식으로 전달되지 않는 한 복사본을 만들지 않습니다. – ShadowRanger

답변

2

사실, 그것은이야 그래서 예제 코드가 작동하기 때문에 트릭 (나 가정 해 봅시다).

사용자 선언 복사 할당 연산자의 X :: 연산자 = 유형 X의 단 하나 개의 매개 변수를 사용하여 클래스 X의 비 정적 템플릿이 아닌 멤버 함수입니다 : 사실
는 표준 말한다 , X &, const X &, 휘발성 X & 또는 const 휘발성 X &. 또한

:

클래스 정의가 명시 적으로 복사 할당 연산자를 선언하지 않는 경우는, 하나는 암시 적으로 선언됩니다.

이제, 예를 들어, 변수에 const를 참조를 복사 할당하려고하지 :

Bb = static_cast<const A&>(Aa); 

결과가 더 이상 예상 하나가 될 것입니다.

어쨌든 비 cv 한정 lvalue/rvalue 참조를 다루는 한, 예제 코드에서 볼 수 있듯이 응답에 사용 된 전달 참조는 정상적으로 작동합니다.
은 특정 유형의 묶음 인을 차단하고 작동합니다. 그게 다야. 당신은 여전히 ​​특별한로 처리 할 수있는 operator=(const A&) 작성해야

참고 : @ Jarod42에 의해 코멘트에서 언급 한 바와 같이

.

실제로 그렇게 특별하지 않습니다. 정의하지 않으면 해당 코드에 적절한 복사 할당 연산자가 없습니다.
AS는 코멘트, 그것은

[...] 리더에 운동으로 남아 정의하는 말했다. :-)

그렇다면 이점은 무엇입니까?
최소한의 실질적인 솔루션을 제공하는 지름길입니다. 물론 완전한 제작 준비가 된 코드는 아닙니다.

관련 문제