2013-09-23 10 views
13

Quindi sto giocando con alcuni array e non riesco a capire perché questo non funzionerà.Assegna array all'array

int numbers[5] = {1, 2, 3}; 
int values[5] = {0, 0, 0, 0, 0}; 
values = numbers; 

il seguente errore appaiono:

Error 1 error C2106: '=' : left operand must be l-value c:\users\abc\documents\visual studio 2012\projects\consoleapplication7\consoleapplication7\main.cpp 9 1 ConsoleApplication7 

Perché non posso farlo in questo modo? Cosa significa l'errore?

risposta

20

Gli array hanno una varietà di comportamento brutto a causa della compatibilità con C di C++. Uno di questi comportamenti è che gli array non sono assegnabili. Utilizzare invece std::array o std::vector.

#include <array> 
... 
std::array<int,5> numbers = {1,2,3}; 
std::array<int,5> values = {}; 
values = numbers; 

Se, per qualche motivo, è necessario utilizzare array, allora sarà necessario copiare gli elementi attraverso un anello, o una funzione che utilizza un ciclo, come std::copy

#include <algorithm> 
... 
int numbers[5] = {1, 2, 3}; 
int values[5] = {}; 
std::copy(numbers, numbers + 5, values); 

Come nota a margine, potresti aver notato una differenza nel modo in cui ho inizializzato l'array values, fornendo semplicemente un elenco di inizializzazione vuoto. Sto facendo affidamento su una norma dello standard che dice che se si fornisce un elenco di inizializzazione per un aggregato, indipendentemente da quanto parziale, tutti gli elementi non specificati vengono inizializzati in valore. Per i tipi interi, l'inizializzazione del valore indica l'inizializzazione a zero. Quindi questi due sono esattamente equivalenti:

int values[5] = {0, 0, 0, 0, 0}; 
int values[5] = {}; 
6

Non è possibile assegnare gli array in C++, è stupido ma è vero. Devi copiare gli elementi dell'array uno per uno. O potresti usare una funzione incorporata come memcpy o std::copy.

Oppure è possibile rinunciare agli array e utilizzare invece std::vector. Possono essere assegnati.

+0

+1 per l'uso di std :: vector – Alex

2

I nomi delle matrici sono valori l costanti non modificabili, non è possibile modificarli.

values = numbers; 
//^
// is array name 

Leggi messaggio di errore del compilatore: "error C2106: '=' : left operand must be l-value" un l-value è modificabile può essere visualizzato nella ss di =.

È possibile assegnare nome di matrice a un puntatore, come:

int* ptr = numbers; 

Nota: nome array è costante, ma è possibile modificarne il contenuto per esempio value[i] = number[i] è un'espressione valida per 0 <= i < 5.

Perché non posso fare così?

Fondamentalmente questo vincolo viene imposto dalla lingua, internamente il nome dell'array viene utilizzato come indirizzo di base e indicizzando con l'indirizzo di base è possibile accedere al contenuto continuare la memoria allocata per l'array. Quindi, in C/C++, i nomi degli array devono apparire a lhs e non a un valore-l.

+0

"I nomi delle matrici sono costanti non il valore-l" I nomi che si riferiscono agli array sono lvalue, poiché tutte le * espressioni-ID * che fanno riferimento a funzioni, variabili o membri dati sono lvalue [ expr.prim.general]/8. È un po 'complicato: l'operatore di assegnazione richiede un * lvalue * modificabile, ma ciò che è, non è definito nello standard C++, solo nello standard C: 6.3.2.1/1 "Un lvalue modificabile è un lvalue che non ha tipo di matrice [...] ". Quindi un array è un lvalue, ma non un lvalue modificabile, e quindi non può apparire al lhs di un compito. – dyp

+0

@DyP si ho capito che dovrei scrivere "I nomi delle matrici sono costanti non modificabili valore-l" " –

+0

@DyP similmente' const' 'i' è valore l non valore modificabile valore-, grazie alla nota ora corretta numeri –

0

valori = numeri; Perché numeri e valori sono puntatori.

int numbers[5] = {1, 2, 3}; 
int values[5] = {0, 0, 0, 0, 0}; 
for(int i = 0;i < 5; i ++){ 
    values[i] = numbers[i]; 
} 
+0

' 'e' values' non sono puntatori, sono array.E risponderò preventivamente alle tue obiezioni.Le matrici non sono puntatori (const o altrimenti) I nomi delle matrici non sono puntatori (const o altrimenti). Le matrici sono array e array i nomi sono sequenze di caratteri usati per riferirsi agli array nel codice sorgente. –

0

std::array è una buona idea, ma questo è anche possibile:

struct arr { int values[5]; }; 

struct arr a{{1, 2, 3}}; 
struct arr b{{}}; 

a = b; 

In caso contrario, utilizzare o std::memcpystd::copy.

Problemi correlati