J'ai rencontré un problème que je ne comprends pas et j'espérais que quelqu'un ici pourrait nous donner un aperçu. Le code simplifié est le suivant (code d'origine était une file d'attente personnalisée/mise en œuvre de file d'attente iterator):Opérateur d'affectation par défaut en classe interne avec les membres de référence
class B
{
public:
B() {};
class C
{
public:
int get();
C(B&b) : b(b){};
private:
B& b;
};
public:
C get_c() { return C(*this); }
};
int main()
{
B b;
B::C c = b.get_c();
c = b.get_c();
return EXIT_SUCCESS;
}
Ce, lors de la compilation, me donne l'erreur suivante:
foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)':
foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator
foo.cpp: In function 'int main()':
foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here
Je peux contourner ce en utilisant deux variables C séparées, car elles sont censées être des objets C indépendants, mais cela ne fait que masquer le problème (je ne comprends toujours pas pourquoi je ne peux pas le faire).
Je pense que la raison est que la référence ne peut pas être copiée, mais je ne comprends pas pourquoi. Dois-je fournir mon propre opérateur d'affectation et copier le constructeur?
Bah, bien sûr que vous avez raison, je ne peux pas croire que j'ai manqué l'explication évidente. Aurait dû prendre plus de café le matin: D – laura
+1. Je trouve que l'habitude d'utiliser "lier" plutôt que "assigner" quand parler de références m'aide à faire cette erreur. –
maintenant, je vais réaffecter une référence et bien sûr, elle va compiler: int a = 3; int b = 4; int & ref = a; ref = b ;. Il est donc possible de réaffecter une référence. – friko