수색…


비 정적 클래스 멤버 수정 자

이 문맥에서 mutable 자는 const 객체의 데이터 필드가 객체의 외부에서 볼 수있는 상태에 영향을 미치지 않고 수정 될 수 있음을 나타 내기 위해 사용됩니다.

값 비싼 계산 결과를 캐시하려는 경우이 키워드를 사용해야합니다.

const 메소드 내에서 잠금 및 잠금 해제 된 잠금 (예 : std::unique_lock ) 데이터 필드가있는 경우이 키워드도 사용할 수 있습니다.

이 키워드를 사용하여 오브젝트의 논리적 구조를 손상시키지 마십시오.

캐싱 예제 :

class pi_calculator {
 public:
     double get_pi() const {
         if (pi_calculated) {
             return pi;
         } else {
             double new_pi = 0;
             for (int i = 0; i < 1000000000; ++i) {
                 // some calculation to refine new_pi
             }
             // note: if pi and pi_calculated were not mutable, we would get an error from a compiler
             // because in a const method we can not change a non-mutable field
             pi = new_pi;
             pi_calculated = true;
             return pi;
         }
     }
 private:
     mutable bool pi_calculated = false;
     mutable double pi = 0;
};

가변 람다

기본적으로 람다의 암시 적 operator()const 입니다. 이것은 람다에 대해 비 const 연산을 수행하는 것을 허용하지 않는다. 수정 멤버를 허용하기 위해 람다는 mutable 수있는 것으로 표시되어 암시 적 operator() 아닌 const .

int a = 0;

auto bad_counter = [a] {
    return a++;   // error: operator() is const
                  // cannot modify members
};

auto good_counter = [a]() mutable {
    return a++;  // OK
}

good_counter(); // 0
good_counter(); // 1
good_counter(); // 2


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow