2017-03-15 12 views
1

, 하나는 쓸 수 있습니다 : 람다에서 완벽한 포워딩? 함수와

template <class T> void f(T&& x) {myfunction(std::forward<T>(x));} 

하지만 람다와

, 우리는 T가 없습니다 :

auto f = [](auto&& x){myfunction(std::forward</*?*/>(x));} 

어떻게 람다에 완벽한 포워딩을 할? decltype(x)std::forward의 유형으로 작동합니까?

답변

4

전달 참조에 바인드 된 람다 인수를 전달하는 표준 방법은 decltype에 참이에 대한

auto f = [](auto&& x){ 
    myfunction(std::forward<decltype(x)>(x)); 
} //      ^^^^^^^^^^^ 
+1

호출 연산자 템플릿으로 람다를 만드는 [C++ 2a] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0428r0.pdf)가 있습니다. 쓰기가 조금 쉬워졌습니다. –

+0

흥미로운 링크. 대답에 직접 링크하는 것이 그만한 가치가 있지 않겠습니까? – skypjack

+0

@skypjack : 초기 단계의 제안이 끔찍하고 투기적인 점을 감안할 때, C++ 14에 관한 질문이기 때문에 의견을 남기는 것이 가장 바람직하다고 생각했습니다. 어쩌면 이것을 받아 들일 실제 결정이 내려지면 우리는 이것을 (7 월?) 업데이트 할 수 있습니다. –

2

내가 좋아하는 관용구이다 : 나는 "과 같이

auto f = [](auto&& x){myfunction(decltype(x)(x));} 

x 형식으로 x "로 선언되었습니다.

이 작동 방식을 확인하려면 xint&& 인 경우 어떻게되는지 확인하십시오. decltype(x)(x)(int&&)(x)이며, 이는 x에 대한 값을 나타냅니다. xint& 인 경우 (int&)(x)이 참조로 전송되지 않습니다. 참고 카테고리는 decltype(x)입니다.

auto f = [](auto&& x){myfunction(std::forward<decltype(x)>(x));} 

대안 :

지금, auto&& 매개 변수에 대해이에 짧은하지만 동일합니다.

auto 대한 파라미터 :

auto f = [](auto x){myfunction(decltype(x)(x));} 

은 추가 카피를 유도

auto f = [](auto x){myfunction(std::forward<decltype(x)>(x));} 

동안 대신 이동에서부터 x.

나는 보통 치료하는 동안 C-스타일 xauto&& 변수가 아닌 경우 너무 위험하다고, decltype(x)(x)는 최악의 x의 형태 정확한 복사본을 만들 수 있습니다 캐스트. 그리고 그것의 간결함을 위해 말해야 할 것이 있습니다.

+0

decltype 캐스트는 깔끔한 트릭이지만'std :: forward '에 대해 좋아하는 것은 전달이 진행 중이고 인근의 &&가 전달 참조라는 읽기 쉽고 (greppable) 힌트를 작성한다는 것입니다 . –

+0

나는 그것에 동의한다; 간결함은 IMO의 의미를 희생합니다. 좋은 트릭 그래도, +1! – Columbo

+0

복사본을 만든 예제를 자세히 설명해 주시겠습니까? '자동'매개 변수 : ... 예 :'int a; 첫 번째 경우 :'int (x)'때문에 copy (확실하게 최적화 됨) : f (a);'auto == int','auto x'가 초기화 될 때 (아마 최적화 됨) 처음 복사 될 때 ) 두 번째 경우 : 이동 (myFunction이 구현 된 경우) : std :: forward가 'int &&'로 캐스트하기 때문에 이동합니다. 그 맞습니까? – Gabriel