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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow