람다를 이해하려고
C ++에서 람다를 이해하려고 할 때 내가 이해하지 못하는 것은 다음과 같습니다.
int multiplier = 5;
auto timesFive = [multiplier](int a) { return a * multiplier; };
std::cout << timesFive(2) << '\n'; // Prints 10
multiplier = 15;
std::cout << timesFive(2) << '\n'; // Still prints 2*5 == 10 (???) - Should it be 30?
프로그램 timesFive()
이 두 번째로 호출 할 때 결과는 30이 될 것으로 예상합니다. 그러나 결과 Still prints 2*5 == 10
가 아닌 이유는 prints 2*15 == 30
무엇입니까? 아마도 람다 함수 multiplier
는 우리가 이미 그것을 포착하려고 시도했지만 어떻게 든의 값을 추적 할 수 없을까요?
그리고 원하는 결과를 얻는 방법은 무엇입니까?
multiplier
값으로 캡처 했습니다. 즉, 람다에 복사되었습니다. 참조로 캡처해야합니다.
int multiplier = 5;
auto timesFive = [&multiplier](int a) { return a * multiplier; };
std::cout << timesFive(2);
multiplier = 15;
std::cout << timesFive(2);
Lambda는 명명 할 수없는 클래스와 그 인스턴스에 대한 구문 적 설탕입니다. 때때로 코드를이 명명 할 수없는 클래스로 확장하면 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다.
[ capture_list ]( arg_list ) -> return_value_clause_opt { body };
매우 대략적으로 (의사 코드)됩니다.
struct anonymous_type {
capture_list;
auto operator()( arg_list ) const -> return_value_clause_opt {
body
}
anonymous_type( capture_list_in ):capture_list(capture_list_in) {}
};
당신이 변수를 나열하는 경우 capture_list
의 일반 이름으로, 그것은되는 복사 익명 클래스 내 사본으로.
그래서 당신 timesFive
은
struct __secret_name__ {
int multiplier;
int operator()(int a) const { return a*multiplier; }
};
int multiplier = 5;
auto timesFive = __secret_name__{multiplier};
변화 꽤 명확해야 multiplier
위의 코드에서하는의 동작을 변경하지 않습니다 timesFive
.
&
이름 앞에 를 넣으면 익명 클래스 내에 비 const
참조 가 배치됩니다.
struct __secret_name__ {
int& multiplier;
int operator()(int a) const { return a*multiplier; }
};
int multiplier = 5;
auto timesFive = __secret_name__{multiplier};
이제 변경 multiplier
하면의 동작이 변경 됩니다. 복사가 아닌 승수에 대한 참조 를 보유 timesFive
하기 때문 입니다.timesFive
간결성을 위해 일부 세부 사항은 위에서 생략했습니다. 이름 __secret_name__
은 박람회 용입니다. 람바의 멤버 변수는 실제로 공개되지 않습니다. 사소하게 구성 가능한 람다는 데이터가 있더라도 구현 정의됩니다. 기타.
ReferenceURL : https://stackoverflow.com/questions/39204589/trying-to-understand-lambdas
'Programing' 카테고리의 다른 글
PHPStorm 새 파일 브랜딩 비활성화 (0) | 2020.12.15 |
---|---|
Pandas에서 datetime 형식을 변경하는 방법 (0) | 2020.12.15 |
Perl에서 정수 나누기를 어떻게해야합니까? (0) | 2020.12.15 |
육각형지도 타일로 지구 덮기 (0) | 2020.12.15 |
어떤 자바 스레드가 CPU를 차지하고 있습니까? (0) | 2020.12.15 |