auto f = [](auto x){ return normalize(x); };
C++14부터는 초기화 캡쳐뿐만 아니라 매개변수로 auto를 사용하는 일반화 람다도 지원한다.
class 컴파일러가_만든_어떤_클래스_이름 {
public:
template<typename T>
auto operator()(T x) const { return normalize(x); }
};
컴파일러에 의해 만들어진 클로저 클래스의 operator()는 위와 같은 모습일 것이다.
만약 normalize가 왼값과 오른값을 다른 방식으로 처리한다면 이 람다는 항상 왼값을 전달하기 때문에 제대로 작성되지 않은 것이다.
제대로 전달하려면 완벽 전달을 사용해야 한다.
auto f = [](auto&& x){ return normalize(std::forward<???>(x)); };
5장에서 완벽 전달을 다룰때는 함수 템플릿 안에서 다룬거라 forward<T>를 사용했는데 람다는 어떻게 해야할까?
정답은 decltype이다. 왼값이 전달되었다면 decltype(x)는 왼값 참조가 산출되고 오른값이 전달되었다면 decltype(x)는 오른값 참조가 산출된다.
auto f = [](auto&& x){ return normalize(std::forward<decltype(x)>(x)); };
auto f = [](auto&&... xs ){ return normalize(std::forward<decltype(xs)>(xs)...); };
C++14의 람다는 가변 인수를 지원하기 때문에 임의 개수의 매개변수들도 완벽 전달이 가능해진다.
◾ std::forward를 통해서 전달할 auto&& 매개변수에는 decltype을 사용하라.
'도서 > Effective Modern C++' 카테고리의 다른 글
[7장] 항목 35 : 스레드 기반 프로그래밍보다 작업 기반 프로그래밍을 선호하라 (0) | 2023.01.30 |
---|---|
[6장] 항목 34 : std::bind보다 람다를 선호하라 (0) | 2023.01.29 |
[6장] 항목 32 : 객체를 클로저 안으로 이동하려면 초기화 캡쳐를 사용하라 (0) | 2023.01.27 |
[6장] 항목 31 : 기본 캡쳐 모드를 피하라 (0) | 2023.01.27 |
[5장] 항목 30 : 완벽 전달이 실패하는 경우들을 잘 알아두라 (0) | 2023.01.27 |