c++ pointeurs Pourquoi une référence à un tableau ne fonctionne-t-elle pas jusqu'à ce que nous utilisions un pointeur?




reference et pointeurs (3)

int*& ref = a;

int* est un type de pointeur, pas un type de tableau. Donc, c'est pourquoi il ne sera pas lié à a , qui a le type int[5] .

Donc, utilisez const

int* const& ref = a;

Cela fonctionne très bien, Parce que le nom du tableau est une constante d'adresse, la référence non-const ne peut pas faire référence à une constante.

Cela fonctionne très bien ...

int a[5] = {1,2,3,4,5}, int *p = a;
int *& ref = p;

Mais pourquoi ça ne marche pas?

int a[5] = {1,2,3,4,5};
int*& ref = a;

Les deux a et p sont des pointeurs et ont la même valeur (adresse de a[0] ). Quand je fais référence à un tableau en utilisant un pointeur ( p ), cela fonctionne très bien.

Mais quand je fais référence à ce tableau a[] directement, ça ne marche pas ... Pourquoi?


a n'est pas un pointeur, c'est un tableau. Il a le type int[5] . Ce qu'il peut faire est de se désintégrer en un pointeur int* , ce qui arrive dans le premier cas. Donc, prendre une référence à p est ok.

Maintenant pour le deuxième cas. Rappelez-vous que a n'est pas un pointeur. Donc, il y a une conversion implicite qui passe de int[5] à int* . Le résultat de cette conversion est une prvalue. Mais vous ne pouvez pas lier une référence lvalue non-const (qui est ce que ref est) à une valeur! Donc, le code ne parvient pas à compiler.

Voici une analogie:

double a = 1.4;
int& b = a; // implicit conversion from 'double' to `int` results in prvalue
            // and you can't bind non-const lvalue refs to rvalues.

En ajoutant à ce qui a déjà été répondu, vous pouvez obtenir une référence à un tableau comme

int a[5];
int (&ref)[5] = a;

Vivre





reference