Posso definir o comprimento de uma matriz usando uma constante; então, por que int d [b] não funciona?

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

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

A definição de f[c]é válida.
A variável btambém é uma constante int, mas o compilador me deu o erro "expressão deve ter um valor constante" para a linha int d[b]. Quais são as diferenças entre be c?

OliverShang
fonte

Respostas:

16

quais são as diferenças entre bec?

c possui um inicializador constante em tempo de compilação, enquanto b não. Um objeto const com inicializador de constante de tempo de compilação é ele próprio um valor constante de tempo de compilação.

Como posso definir um décimo de um arry usando uma constante, então por que isso não funciona?

Não é apenas uma constante que serve. constO qualificador implica a constância do tempo de execução (ou seja, o valor pode ser determinado no tempo de execução, mas não será alterado ao longo da vida útil do objeto). Somente valores constantes de tempo de compilação podem ser usados ​​como tamanho da matriz.

eerorika
fonte
6

Você está usando uma variável não constante para atribuir valor a uma constante. Portanto, o valor dessa variável não pode ser determinado em tempo de compilação . Eu sei que você não está mudando a, mas o compilador não pensa assim.

CoderCharmander
fonte
4

O diagnóstico do compilador deve realmente ser uma expressão constante avaliada em tempo de compilação .

Como o objeto original ao qual bestá atribuído não é const, não bé uma expressão constante avaliável em tempo de compilação; portanto, a compilação falhará, pois matrizes de comprimento variável não são suportadas no C ++ padrão.

Bathsheba
fonte
1

O "const" significa apenas que a variável não será alterada no tempo de execução e não significa que seu valor possa ser deduzido no tempo de compilação.

Eu acho que o que você está procurando é "constexpr". Talvez você possa experimentar assim:

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

O "constexpr" significa uma "const real" e a "const" significa apenas "var que não muda", por algum motivo histórico. Deve-se ter em mente que uma matriz nativa em c ++ sempre é de comprimento fixo, como disse @Bathsheba.

Leon
fonte
De que "outras línguas" você está falando?
Brian
11
@ Brian Desculpe, não é relevante. Eu mudei minha resposta.
Leon
"Nenhum verdadeiro escocês ..." - deixe-me discordar de seu "constexpr", em vez disso, significa uma "const real" e a "const" significa apenas a declaração "non-changing var" . "const" significa "const", "constexpr" significa "constexpr" - eles têm dois significados e implicações distintos no contexto da linguagem c ++. "const" meios "de objecto não pode ser modificado" , "constexpr" meios "é possível avaliar o valor da função ou variável no tempo de compilação"
CharonX
Desculpe, talvez eu tenha expressado incorretamente. Inglês não é minha língua materna.
Leon
1

O termo "constante" é realmente ambíguo e a palavra const- chave é enganosa.

constsignifica: "não permitir que o valor desse objeto não seja alterado após a inicialização". Isso não significa "constante em tempo de compilação". Seu valor inicial pode (e geralmente vem) ainda vir de fontes de tempo de execução.

Você precisa de uma constante em tempo de compilação para um array vinculado.

Às vezes, é possível ter um objeto nomeado fooque seja constante em tempo de compilação, se for const e foi inicializado a partir de uma expressão constante, como um literal ou constexpralgo. Esse é o caso c; não é o caso b.

Raças de leveza em órbita
fonte