99 votes

C++ passe un tableau par référence

est-ce autorisé à passer un tableau par référence ?

  void foo(double& *bar) 

Apparemment, mon compilateur dit non. Pourquoi? Quelle est la bonne façon de passer un tableau par référence? Ou un travail autour? J'ai un argument de tableau que ma méthode doit modifier et que je dois récupérer par la suite. Alternativement, je pourrais faire de ce tableau un membre de classe, ce qui fonctionne bien, mais il présente de nombreux inconvénients pour d'autres parties de mon code (que je voudrais éviter).

Merci et salutations.

168voto

jrok Points 30472

Les tableaux ne peuvent être passés que par référence, en fait :

 void foo(double (&bar)[10])
{
}

Cela vous empêche de faire des choses comme :

 double arr[20];
foo(arr); // won't compile

Pour pouvoir passer un tableau de taille arbitraire à foo , faites-en un modèle et capturez la taille du tableau au moment de la compilation :

 template<typename T, size_t N>
void foo(T (&bar)[N])
{
    // use N here
}

Vous devriez sérieusement envisager d'utiliser std::vector , ou si vous avez un compilateur qui prend en charge c++11, std::array .

6voto

Naszta Points 4322

Si vous souhaitez modifier uniquement les éléments :

 void foo(double *bar);

est assez.

Si vous souhaitez modifier l'adresse en (ex : realloc ), mais que cela ne fonctionne pas pour les tableaux :

 void foo(double *&bar);

est la forme correcte.

2voto

Kirilodius Points 98

8.3.5.8 Si le type d'un paramètre inclut un type de la forme "pointeur vers un tableau de bornes inconnues de T" ou "référence au tableau de bornes inconnues de T", le programme est mal formé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X