Szukaj…


niestatyczny modyfikator członka klasy

mutable modyfikator w związku z tym stosuje się do wskazania, że pole danych obiektu const może być modyfikowane bez wpływu na zewnętrznie widoczny stan obiektu.

Jeśli myślisz o buforowaniu wyniku drogich obliczeń, prawdopodobnie powinieneś użyć tego słowa kluczowego.

Jeśli masz pole danych blokady (na przykład std::unique_lock ), które jest zablokowane i odblokowane w metodzie const, to słowo kluczowe jest również tym, czego możesz użyć.

Nie należy używać tego słowa kluczowego, aby przełamać logiczną trwałość obiektu.

Przykład z buforowaniem:

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;
};

mutable lambdas

Domyślnie domyślnym operator() lambda jest const . Nie zezwala to na wykonywanie operacji non- const na lambda. Aby umożliwić modyfikowanie elementów, lambda może być oznaczona jako mutable , co powoduje, że domyślny operator() nie jest 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow