C++
veranderlijk trefwoord
Zoeken…
niet-statische klasse lid modifier
mutable
modifier in deze context wordt gebruikt om aan te geven dat een gegevensveld van een const-object kan worden gewijzigd zonder de extern zichtbare status van het object te beïnvloeden.
Als u overweegt om een resultaat van dure berekeningen in het cachegeheugen op te slaan, moet u dit trefwoord waarschijnlijk gebruiken.
Als u een gegevensveld voor vergrendeling (bijvoorbeeld std::unique_lock
) hebt dat is vergrendeld en ontgrendeld in een const-methode, kunt u dit sleutelwoord ook gebruiken.
Gebruik dit trefwoord niet om het logische geheel van een object te doorbreken.
Voorbeeld met caching:
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;
};
veranderlijke lambdas
Standaard is de impliciete operator()
van een lambda const
. Dit verbiedt het uitvoeren van niet- const
operaties op de lambda. Om wijzigende leden toe te staan, kan een lambda als mutable
worden gemarkeerd, waardoor de impliciete operator()
niet- 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