Programing

람다를 이해하려고

lottogame 2020. 12. 15. 08:11
반응형

람다를 이해하려고


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

반응형