2012-11-21 3 views
1

값으로 A를 사용하는 첫 번째 예제는 두 번의 이동을 수행하고 refref를 통한 이동은 한 번만 수행합니다. 그 차이점은 무엇입니까? cppreference.com 가입일이 예제에서 이동과 앞으로가 다릅니다.

struct A 
{ 
    A() { cout << "constructor" << endl;} 
    A(const A&) { cout << "copy constructor " << endl;} 
    void operator=(const A&) { cout << "assignment operator" << endl; } 
    A(A&&) { cout << "move copy constructor" << endl;} 
    void operator=(A&&) { cout << "move assignment operator" << endl;} 
}; 
struct C { 
    void func(A t) { 
    d.a = std::move(t); 
    } 
    struct Data { 
    A a;  
    }; 
    Data d; 
}; 
struct B { 
    void func(A t) { 
    C c; 
    c.func(std::move(t)); 
    } 
}; 
////////////////////////////////////////////////////////// 
struct C { 
    template<class T> 
    void func(T&& t) { 
    d.a = std::forward<T>(t); 
    } 
    struct Data { 
    A a;  
    }; 
    Data d; 
}; 
struct B { 
    template<class T> 
    void func(T&& t) { 
    C c; 
    c.func(std::forward<T>(t)); 
    } 
}; 
+1

이 "보편적 참조"꽤 관련 설명이다 그들은 표준 : move'와'표준'에 관한 방법 :: forward' : http://scottmeyers.blogspot.com/2012/11/on-superfluousness-of-stdmove.html –

+0

내가 이해하는 한, 그들은이 경우에도 똑같이 행동해야합니까? – hidayat

답변

2

:

함수 템플릿은 다음 방법에 따라 사용

, 전달이 호출 함수에 전달 된 그대로 다른 함수의 인수. std::foward<T>(t)는 단순히 앞으로 c.func() 정확히 같은 B::func()T&& 객체가 호출됩니다

struct B { 
    template<class T> 
    void func(T&& t) { 
    C c; 
    c.func(std::forward<T>(t)); 
    } 
}; 

당신의 조각에 따라서

template<typename T> 
wrapper(T&& arg) { 
    foo(std::forward<T>(arg)); 
} 

. 이것은 이동을 필요로하지 않으므로, std::forward<T>을 사용하는 이동이 적게 나타나는 이유입니다.

정말 std::movestd::forward의이 주제에 스콧 마이어의 블로그 게시물을 체크 아웃하는 것이 좋습니다 : http://scottmeyers.blogspot.com/2012/11/on-superfluousness-of-stdmove.html

관련 문제