Puedo definir la longitud de una matriz usando una constante, entonces, ¿por qué no funciona int d [b]?

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

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

La definición de f[c]es válida.
La variable btambién es una constante int, pero el compilador me dio el error "la expresión debe tener un valor constante" para la línea int d[b]. ¿Cuáles son las diferencias entre by c?

OliverShang
fuente

Respuestas:

16

¿Cuáles son las diferencias entre byc?

c tiene un inicializador constante de tiempo de compilación, mientras que b no. Un objeto constante con inicializador constante de tiempo de compilación es en sí mismo un valor constante de tiempo de compilación.

Como puedo definir la longitud de un arry usando una constante, entonces, ¿por qué no funciona?

No cualquier constante será suficiente. constel calificador implica constancia de tiempo de ejecución (es decir, el valor puede determinarse en tiempo de ejecución pero no cambiará durante la vida útil del objeto). Solo se pueden usar valores constantes de tiempo de compilación como tamaño de matriz.

eerorika
fuente
6

Está utilizando una variable no constante para asignar valor a una constante. Por lo tanto, el valor de esa variable no se puede determinar en tiempo de compilación . Sé que no estás cambiando a, pero el compilador no piensa así.

CodificadorCharmander
fuente
4

El diagnóstico del compilador realmente debería ser una expresión constante evaluable en tiempo de compilación .

Dado que el objeto original al que bestá asignado no lo es const, no bes una expresión constante evaluable en tiempo de compilación, por lo que la compilación fallará ya que las matrices de longitud variable no son compatibles con C ++ estándar.

Betsabé
fuente
1

El "const" solo significa que la variable no cambiará en tiempo de ejecución, y no significa que su valor pueda deducirse en tiempo de compilación.

Supongo que lo que estás buscando es "constexpr". Tal vez puedas probarlo así:

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

El "constexpr" en cambio significa "const real" y el "const" solo significa "var que no cambia", debido a alguna razón histórica. Debe tenerse en cuenta que una matriz nativa en c ++ siempre tiene una longitud fija, como dijo @Bathsheba.

León
fuente
¿De qué "otros idiomas" hablas?
Brian
1
@Brian Lo siento, no es relevante. Cambié mi respuesta.
Leon
"No es un verdadero escocés ..." - déjame estar en desacuerdo con tu "constexpr" en su lugar significa "const real" y la "const" solo significa "var no cambiante" . "const" significa "const", "constexpr" significa "constexpr": tienen dos significados e implicaciones distintos en el contexto del lenguaje c ++. "const" significa "El objeto no se puede modificar" , "constexpr" significa "es posible evaluar el valor de la función o variable en tiempo de compilación"
CharonX
Lo siento, tal vez lo expresé incorrectamente. El inglés no es mi lengua materna.
Leon
1

El término "constante" es realmente ambiguo, y la palabra clave constes engañosa.

constsignifica: "no permitir que el valor de este objeto no se cambie después de la inicialización". No , no significa "constante de tiempo de compilación". Su valor inicial puede (y generalmente lo hace) aún provenir de fuentes de tiempo de ejecución.

Necesita una constante de tiempo de compilación para una matriz enlazada.

A veces es posible tener un objeto llamado fooque es constante en tiempo de compilación, si lo es, const y se inicializó a partir de una expresión constante, como un literal o una constexprcosa. Ese es el caso c; No es el caso b.

Carreras de ligereza en órbita
fuente