Je peux définir la longueur d'un tableau à l'aide d'une constante, alors pourquoi int d [b] ne fonctionne-t-il pas?

11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

La définition de f[c]est valide.
La variable best également une constante int, mais le compilateur m'a donné l'erreur "l'expression doit avoir une valeur constante" pour la ligne int d[b]. Quelles sont les différences entre bet c?

OliverShang
la source

Réponses:

16

quelles sont les différences entre b et c?

c a un initialiseur de constante de temps de compilation, contrairement à b. Un objet const avec initialiseur de constante de temps de compilation est lui-même une valeur de constante de temps de compilation.

Puisque je peux définir une lenth d'un arry en utilisant une constante, alors pourquoi cela ne fonctionne-t-il pas?

Pas n'importe quelle constante fera l'affaire. constLe qualificatif implique une constance d'exécution (c'est-à-dire que la valeur peut être déterminée lors de l'exécution mais ne changera pas pendant la durée de vie de l'objet). Seules les valeurs de constante de temps de compilation peuvent être utilisées comme taille de tableau.

eerorika
la source
6

Vous utilisez une variable non constante pour attribuer une valeur à une constante. Par conséquent, la valeur de cette variable ne peut pas être déterminée au moment de la compilation . Je sais que vous ne changez pas a, mais le compilateur ne pense pas comme ça.

CoderCharmander
la source
4

Le diagnostic du compilateur doit vraiment être une expression constante évaluable en temps de compilation .

Étant donné que l'objet d'origine auquel best affecté n'est pas const, bn'est pas une expression constante évaluable au moment de la compilation, la compilation échouera car les tableaux de longueur variable ne sont pas pris en charge dans C ++ standard.

Bathsheba
la source
1

Le "const" signifie simplement que la variable ne changera pas au moment de l'exécution, et ne signifie pas que sa valeur peut être déduite au moment de la compilation.

Je suppose que ce que vous recherchez est "constexpr". Vous pouvez peut-être l'essayer comme ceci:

constexpr int b = 4; // can't be assigned from a!
int d[b];

Le "constexpr" signifie à la place un "vrai const" et le "const" signifie seulement "var non-changeant", pour une raison historique. Il faut garder à l'esprit qu'un tableau natif en c ++ est toujours de longueur fixe comme l'a dit @Bathsheba.

Léon
la source
De quelles «autres langues» parlez-vous?
Brian
1
@Brian Désolé, ce n'est pas pertinent. J'ai changé ma réponse.
Leon
"No true scotsman ..." - permettez-moi d'être en désaccord avec votre "constexpr" signifie à la place un "real const" et le "const" signifie seulement "var non-changeant" . "const" signifie "const", "constexpr" signifie "constexpr" - ils ont deux significations et implications distinctes dans le contexte du langage c ++. "const" signifie "L'objet ne peut pas être modifié" , "constexpr" signifie "il est possible d'évaluer la valeur de la fonction ou de la variable au moment de la compilation"
CharonX
Désolé, je l'ai peut-être mal exprimé. L'anglais n'est pas ma langue maternelle.
Leon
1

Le terme «constant» est vraiment ambigu et le mot const- clé est trompeur.

constsignifie: "ne pas autoriser la valeur de cet objet ne sera pas modifiée après l'initialisation". Cela ne signifie pas "constante de temps de compilation". Sa valeur initiale peut (et le fait généralement) provenir toujours de sources d'exécution.

Vous avez besoin d'une constante au moment de la compilation pour un tableau lié.

Il est parfois possible d'avoir un objet nommé fooqui est constant au moment de la compilation, s'il l'est const et qu'il a été initialisé à partir d'une expression constante, comme un littéral ou une constexprchose. C'est le cas pour c; ce n'est pas le cas pour b.

Courses de légèreté en orbite
la source