>백엔드 개발 >C++ >C 11 람다에서 캡처된 변수를 수정하는 데 'mutable' 키워드가 필요한 이유는 무엇입니까?

C 11 람다에서 캡처된 변수를 수정하는 데 'mutable' 키워드가 필요한 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-28 11:10:14718검색

Why Is the `mutable` Keyword Necessary for Modifying Captured Variables in C  11 Lambdas?

C 11에서 "변경 가능"의 필요성 이해 Lambda 값별 캡처

C 11의 Lambda 표현식은 두 가지 캡처 모드를 제공합니다. 참조로 캡처 및 값으로 캡처. 변수를 값으로 캡처할 때 람다는 이를 수정할 수 있습니다. 그러나 이 동작은 자동으로 수행되지 않습니다. 수정을 허용하려면 "mutable" 키워드가 필요합니다.

"Mutable" 요구 사항의 근거

람다와 기존 명명된 함수의 주요 차이점 중 하나는 람다가 설계되었다는 것입니다. 로컬 임시 상태에서 작동하는 일련의 작업을 캡슐화합니다. 기본적으로 이 상태는 람다 실행 전반에 걸쳐 일정하게 유지되어야 합니다.

"변경 가능"하지 않고 값별 캡처 변수의 수정을 허용하면 람다는 함수 결정론의 원칙을 위반하게 됩니다. 람다는 주변 코드의 상태에 관계없이 호출될 때마다 동일한 출력을 생성해야 합니다. 값별 캡처 변수를 수정하면 비결정성이 도입되어 람다의 동작을 예측하기 어려워집니다.

값별 캡처 이해

값별 캡처는 캡처된 변수의 로컬 복사본을 생성하도록 설계되었습니다. 이 복사본은 변경할 수 없으므로 람다의 동작이 일관되게 유지됩니다. 그러나 람다가 캡처된 변수의 복사본을 변경해야 하는 상황이 있을 수 있습니다.

예를 들어 다음 코드를 고려해 보세요.

int main() {
    int n;
    [&](){n = 10;}();             // OK
    [=]() mutable {n = 20;}();    // OK
    // [=](){n = 10;}();          // Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       // "10"
}

"변경 가능"하지 않으면 람다 캡처가 -by-value는 "n"의 복사본을 수정할 수 없습니다. 이렇게 하면 람다 실행으로 원래 "n" 변수가 수정되더라도 출력의 일관성이 유지됩니다.

"변경 가능"을 사용하면 람다가 캡처된 복사본을 수정할 수 있음을 명시적으로 나타냅니다. 이를 통해 엔클로징 함수의 동작에 영향을 주지 않고 람다에서 "n"의 복사본을 변경할 수 있습니다.

위 내용은 C 11 람다에서 캡처된 변수를 수정하는 데 'mutable' 키워드가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.