수색…
비 정적 클래스 멤버 수정 자
이 문맥에서 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