2014-11-23 8 views
9

Non vedo alcun motivo logico. Voglio dire, si può facilmente superare il requisito utilizzando una struttura che contiene un membro di matrice in questo modo:Perché ISO C++ proibisce il ritorno degli array?

template <size_t n> 
struct arr { int d[n]; }; 

auto fnReturningArray() 
{ 
    return arr<3>{0, 1, 2}; 
}; 

Che si comporterà allo stesso modo esatto come se la matrice è direttamente restituito con la piccola differenza che si deve prima accedere alla membro della struttura 'd' per usarlo. Anche lo stesso standard ha aggiunto funzionalità simili con il tipo 'std :: array'. Quindi sembra che sia possibile l'implementazione. Perché allora ISO C++ ha vietato questa azione? Forse compatibilità con il codice legacy (ma non riesco a credere che sia così, come con le altre novità aggiunte, è finita da tempo, come ad esempio il nuovo significato della parola chiave 'auto').

+6

Perché non è possibile copiare gli array. – Columbo

+3

Gli array non sono copiabili o assegnabili, quindi non è possibile restituirli o passarli per valore. Per quanto riguarda il motivo, beh, sarebbe una buona domanda. – juanchopanza

+0

@Columbo Ma sono diventati magicamente copiabili quando in struct. – AnArrayOfFunctions

risposta

3

Oltre al fatto che la norma non lo consente, e le ragioni storiche che possono spiegare essa, la questione è sintattica:

immaginare che sarebbe consentita: come è possibile distinguere la denominazione del intera matrice, contro l'indirizzo array, vs un unico elemento:

auto fnReturningArray() 
{ 
    int a[3] = {0, 1, 2}; 
    return a;  // what is meant here ? the address of the array ? or the whole array ? 
}; 

Se desideri cambiare il significato delle norme esistenti (come ad esempio Tating che sarebbe l'intero array), si avrebbe enormi problemi con l'eredità codice.

+2

Presumibilmente avresti una regola che afferma che stai restituendo 'int [3]', perché questo è il tipo di 'a'. Se la lingua fosse autorizzata a restituire gli array, questo avrebbe perfettamente senso. Stai usando una discussione circolare qui. – juanchopanza

+8

È facile: 'a' è un array, quindi significherebbe che stai restituendo un array. Se vuoi un puntatore al primo elemento, devi scrivere '& a [0]'. Non è come funziona C++, ma sarebbe un linguaggio perfettamente sensato. – hvd

+1

@hvd: Ma il fatto che non sia il modo in cui funziona C++ significa che sarebbe confusa/fuorviante/sintassi ambigua _in C++ _ se aggiunta. –

0

La risposta come la vedo io, è duplice:

  1. Compatibilità con C. C non funziona in questo modo. Perché? Nessuna idea. C non è mai stato logico iniziare con vari aspetti.

  2. C++ preferisce le funzioni di libreria sulle funzionalità del linguaggio. Vedendo che C++ 98 era il primo standard, e per lo più copiava le basi da C (vedi punto 1), questo era corretto nella prima revisione principale, C++ 11, che introduce il tipo di libreria std :: array, che , come una pura e semplice funzionalità di libreria, risolve tutti i bizzarri bizzarri che gli array in stile C comportano.

In sintesi: anche se potrebbe avere senso per avere semantica di valore corretto per gli array, non accadrà mai, perché la carenza apparente può essere risolto senza rendere il linguaggio più complesso di quanto non lo sia già. È estremamente difficile liberarsi della compatibilità legacy e retrocompatibile, quindi l'opzione corrente di std :: array è proprio ciò che si desidera. Usalo. È semplice. Ti piacerà. Un sacco.

Problemi correlati