2010-09-07 21 views
7

$ 4,2/1 - "An Ivalue o rvalue di tipo ‘matrice di N T’o‘vettore di sconosciuta bound T’può essere convertito in un rvalue di tipo‘puntatore a T’ Il risultato è un puntatore al primo elemento della matrice. "Array e rvalue

Non sono sicuro di come si ottiene un valore di un tipo di matrice diverso dall'inizializzazione/dichiarazione?

+1

possibile duplicato di [Penso che possa essere venuto fuori con un esempio di rvalue del tipo di matrice] (http://stackoverflow.com/questions/4058151/i-think-i-ay-have-come-up- con-un-esempio-di-rvalore-di-tipo-matrice) –

risposta

-2

Non è possibile ottenere un valore del tipo di array. Le matrici possono essere solo lvalue e ogni volta che vengono utilizzate in un lvalue decadono in un puntatore al primo elemento.

int array[10]; 
int * p = array; // [1] 

L'espressione array in [1] è un lvalue di tipo int (&)[10] che viene convertito in un rvalue di tipo int *p, cioè la matrice rvalue di N == 10 == T int viene convertito un lvalue di tipo puntatore a T == int.

+0

Puoi per favore mostrarmi un esempio in cui la citazione sopra vale per un valore Rvalue di tipo Array? – Chubsdad

+0

È questo il motivo per cui le funzioni non possono restituire tipi di array? –

+0

@Cedric H .: In §8.3.5 [dcl.fct]/3 lo standard specifica che * Dopo aver determinato il tipo di ciascun parametro, qualsiasi parametro di tipo "matrice di T" o "funzione che restituisce T" viene regolato per essere "Pointer to T" o "pointer to function return T," rispettivamente. * Cioè, lo standard specifica che 'void foo (char [10])' è una dichiarazione esattamente equivalente a 'void foo (char \ *)' - - questo è per argomenti. Quindi in §8.3.5/6 dice: * Le funzioni non devono avere un tipo di ritorno di tipo array o funzione, sebbene possano avere un tipo di ritorno di puntatore o riferimento a tali cose *. per i tipi di reso –

-2

Questo potrebbe rappresentare la possibilità di dimostrare il valore Array Rvalue?

int main(){ 
int buf[10][10]; 

int (*p)[10] = buf; 

int (*p2)[10] = p;  // LValue to Rvalue conversion of Array type 'p' 
} 
+2

No ... p non è un tipo di array ... è un puntatore a un array. –

10

Non sono sicuro di ciò a cui si fa riferimento per "inizializzazione/dichiarazione" in questo contesto. Nel seguito, la matrice è una prvalue

template<typename T> using alias = T; 

int main() { return alias<int[]>{1, 2, 3}[0]; } 

Questo può essere verificato decltype(alias<int[]>{1, 2, 3}) avere il tipo int[3]. La creazione di array in questo modo al volo non era inizialmente pensata per funzionare, ma è stata inserita nel progetto di lavoro a margine del lavoro correlato sull'inizializzazione uniforme. Quando mi sono reso conto che alcuni paragrafi nella bozza di lavoro C++ 0x non consentono un caso speciale di questa creazione al volo di array temporaries mentre altri paragrafi lo consentono, ho inviato un rapporto sui difetti al comitato C++, che poi sulla base l'implementazione parzialmente funzionante del GCC ha deciso di sostenere pienamente questo.

+0

Per essere più specifici, nel testo corrente, 'f(). Array' è un xvalue no? Quello che penso sia impossibile da ottenere è un valore dell'array, no? –

+1

@ Peregring-lk si ora è un xvalue (non al momento della risposta). E in "alias {1, 2, 3}" l'espressione è sia un valore x che un valore.Innanzitutto è un valore privo senza un oggetto associato e quando ci si indicizza, la "conversione di materializzazione" crea un oggetto per esso e fornisce l'espressione value-category "xvalue", prima di prendere un puntatore al primo elemento dell'array. –