더북(TheBook)

[&]라고 쓰면 바깥 범위의 모든 변수를 참조로 접근할 수 있다. 따라서 람다 표현식의 본문에서 코드로 값을 변경할 수 있다. 이 경우엔 mutable 키워드를 쓸 필요가 없다. 접근하려는 변수는 람다 표현식 정의 앞에만 정의되어 있으면 된다.

자신의 주소를 포함하는 변수에 접근하는 람다의 주소를 저장하는 변수 유형을 지정하기 위해 auto를 사용할 수 없다. 이는 변수를 사용하는 표현식으로 변수를 초기화하려는 것을 의미한다. 정의되고 있는 변수를 참조하는 람다에는 auto를 사용할 수 없다. auto는 자기 참조(self-reference)를 허용하지 않는다.

바깥 범위에서 원하는 변수만 캡처할 수 있다. 값으로 접근하고 싶은 변수를 캡처하려면 캡처 절에 변수 이름만 쓰면 된다. 참조로 접근하고 싶은 변수를 캡처하려면 이름 앞에 &를 붙이면 된다. 캡처 절에 둘 이상의 변수를 쓸 때는 ,로 구분한다. 캡처 절에 =을 쓴 다음에 참조로 캡처할 변수만 쓰는 것도 가능하다. 캡처 절을 [=, &factor]로 쓰면 factor를 참조로 접근하고, 나머지 다른 변수들은 값으로 접근한다는 뜻이다. 캡처 절을 [&, factor]로 쓰면 factor를 값으로 캡처하고 나머지 다른 변수들은 참조로 캡처한다는 뜻이다. 값으로 캡처한 factor의 복제본을 수정하고 싶다면 mutable 키워드를 지정해야 한다.

Warning

람다 표현식에서 바깥 범위에 있는 모든 변수를 캡처하면 실제로 그 변수를 참조하는지와 상관없이 모든 변수의 복제본을 만들어야 하므로 오버헤드가 굉장히 커질 수 있다. 따라서 꼭 필요한 변수만 캡처하는 것이 훨씬 더 합리적이다.

transform() 알고리즘은 인수로 전달된 함수를 원소들의 범위에 적용할 수 있다. transform()의 처음 두 인수는 함수 인수를 적용할 범위를 지정하는 반복자이며, 세 번째 인수는 결과로 돌려줄 시작 위치를 지정하는 반복자다. 네 번째 인수는 입력 범위에 적용할 함수를 지정한다. 펑터, 람다 표현식, std::function 템플릿 타입을 transform() 알고리즘에 사용하는 방법을 예제로 살펴보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.