Solución:
Las matrices tienen una variedad de comportamientos desagradables debido a la compatibilidad con versiones anteriores de C ++ con C. Uno de esos comportamientos es que las matrices no se pueden asignar. Usar std::array
o std::vector
en lugar de.
#include <array>
...
std::array<int,5> numbers = {1,2,3};
std::array<int,5> values = {};
values = numbers;
Si, por alguna razón, debe usar matrices, entonces tendrá que copiar los elementos a través de un bucle, o una función que use un bucle, como std::copy
#include <algorithm>
...
int numbers[5] = {1, 2, 3};
int values[5] = {};
std::copy(numbers, numbers + 5, values);
Como nota al margen, es posible que haya notado una diferencia en la forma en que inicialicé el values
matriz, simplemente proporcionando una lista de inicializadores vacía. Confío en una regla del estándar que dice que si proporciona una lista de inicializadores para un agregado, no importa cuán parcial sea, todos los elementos no especificados tienen valor inicializado. Para los tipos enteros, la inicialización del valor significa la inicialización a cero. Entonces estos dos son exactamente equivalentes:
int values[5] = {0, 0, 0, 0, 0};
int values[5] = {};
No puede asignar matrices en C ++, es estúpido pero es cierto. Tienes que copiar los elementos de la matriz uno por uno. O puede usar una función incorporada como memcpy
o std::copy
.
O podría renunciar a las matrices y usar std::vector
en lugar de. Pueden asignarse.
Los nombres de las matrices tienen un valor l constante no modificable, no se puede modificar.
values = numbers;
// ^
// is array name
Lea el mensaje de error del compilador: "error C2106: '=' : left operand must be l-value"
un valor l es modificable puede aparecer en lhs de =
.
Puede asignar un nombre de matriz a un puntero, como:
int* ptr = numbers;
Nota: el nombre de la matriz es constante pero puede modificar su contenido, por ejemplo value[i] = number[i]
es una expresión válida para 0 <= i < 5
.
¿Por qué no puedo hacer eso?
Básicamente, esta restricción es impuesta por el idioma, internamente el nombre de la matriz se utiliza como dirección base y, al indexar con la dirección base, puede acceder al contenido y continuar con la memoria asignada para la matriz. Entonces, en C / C ++, los nombres de las matrices deben aparecer en lhs, no en un valor l.