Voici une autre perspective : Il n'y a pas un seul type "tableau" en C. Au contraire, T[N]
est un a a différents pour chaque N
. Donc T[1]
, T[2]
etc., sont tous différents types .
En C, il n'y a pas de surcharge de fonctions, et donc la seule chose sensée que vous auriez pu autoriser serait une fonction qui prend (ou renvoie) une fonction un seul type de tableau :
void foo(int a[3]); // hypothetical
Vraisemblablement, cela a été considéré comme beaucoup moins utile que la décision actuelle de faire en sorte que tous les tableaux se décomposent en un pointeur sur le premier élément et que l'utilisateur doive communiquer la taille par d'autres moyens. Après tout, ce qui précède pourrait être réécrit comme suit :
void foo(int * a)
{
static const unsigned int N = 3;
/* ... */
}
Il n'y a donc pas de perte de puissance expressive, mais un gain énorme en généralité.
Notez que cela n'est pas différent en C++, mais la génération de code basée sur des modèles vous permet d'écrire une fonction modélisée foo(T (&a)[N])
, donde N
est déduit pour vous - mais cela signifie simplement que vous pouvez créer une famille entière de distinct, différent fonctions, une pour chaque valeur de N
.
Dans un cas extrême, imaginez que vous ayez besoin de deux fonctions <code>print6(const char[6])</code> y <code>print12(const char[12])</code> pour dire <code>print6("Hello")</code> y <code>print12("Hello World")</code> si vous ne voulez pas décomposer les tableaux en pointeurs, sinon vous devrez ajouter une conversion explicite, <code>print_p((const char*)"Hello World")</code> .
3 votes
Pour information, cela vient du C et comme les tableaux (les primitifs, pas les
std::vector
ostd::array
) a été transposé dans le C++ pratiquement sans changement, je soupçonne que la raison est la même.0 votes
@delnan, la raison est la même ? quelle est la "même" raison ? Veuillez être plus précis.
0 votes
Je crois que vous pouvez le faire avec boost::array (ou tr1::array).
1 votes
...(ou std::vector), etc. Votre question porte sur une décision de conception que quelqu'un a prise pour le C il y a environ 40 ans. La réponse à votre question (pour le C++) est "qui s'en soucie". Ce n'est pas un problème pour le C++ moderne parce que c'est généralement une bonne idée d'éviter de déclarer des tableaux bruts (et des pointeurs bruts) quand c'est possible. Il est préférable d'utiliser une classe de tableau de niveau supérieur, comme l'une de celles que j'ai énumérées.
0 votes
Parce que (1) Dennis Ritchie a intégré une équivalence pointeur/rayon dans le langage C il y a plus de 40 ans, et (2) ce serait une très mauvaise idée.