Question Pourquoi ne puis-je pas déclarer une référence à un objet mutable? ("La référence ne peut pas être déclarée mutable")


Disons que nous avons un test.cpp comme suit:

class A;

class B
{
    private:
        A mutable& _a;
};

Compilation:

$> gcc test.cpp
test.cpp:6:20: error: reference ‘_a’ cannot be declared ‘mutable’ [-fpermissive]

Mon gcc:

$> gcc --version
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Pourquoi?


24
2017-12-12 02:11


origine


Réponses:


Il n'y a aucune raison d'avoir un membre de référence mutable. Pourquoi? Parce que les fonctions de membre const pouvez changer l'objet référencé par un membre de la classe:

class B {
public:
    B(int var) : n(var) {};
    void Set(int val) const { n = val; }  //no error
    void SetMember(int val) const { m = val; }  //error assignment of member `B::m' in read-only structure
protected:
    int& n;
    int m;
};

36
2017-12-12 02:58



Les références ne peuvent être attribuées que lors de la construction d'un objet et ne peuvent pas être modifiées par la suite. Les rendant ainsi mutable n'aurait aucun sens, c'est pourquoi la norme ne le permet pas.


10
2017-12-12 02:13



Selon la norme: [7.1.1 para 8]:

"Le spécificateur mutable ne peut être appliqué qu'aux noms de données de classe les membres (9.2) et ne peuvent pas être appliqués aux noms déclarés const ou static, et ne peut pas être appliqué aux membres de référence. "

Donc c'est juste illégal.


9
2017-12-12 02:27



Cela pourrait vous faire perdre la tête, mais une référence n'est jamais mutable (ne peut pas faire référence à un autre objet) et la valeur référencée est toujours mutable (sauf si vous avez une référence à const):

#include <iostream>

struct A
{
  int& i;
  A(int& n): i(n) {}
  void inc() const 
  {
    ++i;
  }
};

int main()
{
  int n = 0;
  const A a(n);
  a.inc();
  std::cout << n << '\n';
}

Une méthode const signifie qu'un qualificatif de niveau supérieur est ajouté aux membres. Pour une référence, cela ne fait rien (= int & const a;), pour un pointeur, il fait le pointeur, pas le pointe const (= int* const p, ne pas const int* p;).


2
2017-12-12 08:27