2010-09-07 25 views
7

$ 4.2/1 - « Un lvalue ou rvalue de type « tableau de N T » ou « tableau de inconnu lié de T » peut être converti en un rvalue de type « pointeur vers T. » Le résultat est un pointeur vers le premier élément du tableau. "Matrice et rvalue

Je ne suis pas sûr de savoir comment obtenir une valeur de type tableau autre que lors de l'initialisation/déclaration?

+1

duplication possible de [Je pense que je peux avoir trouvé un exemple de valeur de type tableau] (http://stackoverflow.com/questions/4058151/i-think-i-may-have-come-up- avec-un-exemple-de-valeur-de-type-tableau) –

Répondre

-2

Vous ne pouvez pas obtenir une valeur de type tableau. Les tableaux ne peuvent être que des lvalues, et chaque fois qu'ils sont utilisés dans une lvalue, ils se désintègrent en un pointeur vers le premier élément.

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

L'expression array dans [1] est un lvalue de type int (&)[10] qui est converti en un rvalue de type int *p, qui est, le réseau rvalue de N == 10 == T int est converti en une lvalue de type pointeur sur T == int.

+0

Pouvez-vous s'il vous plaît me montrer un exemple où la citation ci-dessus est valable pour un type Rvalue of Array? – Chubsdad

+0

Est-ce la raison pour laquelle les fonctions ne peuvent pas retourner les types de tableau? –

+0

@Cedric H .: Dans le §8.3.5 [dcl.fct]/3 la norme spécifie que * Après avoir déterminé le type de chaque paramètre, tout paramètre de type "tableau de T" ou "fonction retournant T" est ajusté pour être "Pointeur vers T" ou "pointeur vers la fonction retournant T", respectivement. * Ceci signifie que 'void foo (char [10])' est une déclaration exactement équivalente à 'void foo (char \ *)' - - C'est pour les arguments. Puis au §8.3.5/6, il est dit: * Les fonctions ne doivent pas avoir un type de retour de type tableau ou fonction, bien qu'elles puissent avoir un type de retour de type pointeur ou une référence à de telles choses *. pour les types de retour –

-2

Serait-ce une chance de démontrer 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

Nope ... p n'est pas un type de tableau ... c'est un pointeur vers un tableau. –

10

Je ne suis pas sûr de ce que vous faites référence à "initialisation/déclaration" dans ce contexte. Dans ce qui suit, le tableau est un prvalue

template<typename T> using alias = T; 

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

Cela peut être vérifié par decltype(alias<int[]>{1, 2, 3}) ayant le type int[3]. Créer des tableaux de cette façon à la volée n'était pas initialement destiné à fonctionner, mais a glissé dans le brouillon de travail en cours de travail connexe sur l'initialisation uniforme. Quand j'ai réalisé que certains paragraphes dans le brouillon de travail de C++ 0x interdisent un cas particulier de cette création à la volée de temporaires de tableau alors que d'autres paragraphes le permettent, j'ai envoyé un rapport de défaut au comité C++, qui de la mise en œuvre partielle de GCC a décidé de soutenir pleinement cela.

+0

Pour être plus précis, dans le libellé actuel, 'f(). Array' est une valeur x n'est pas? Ce que je pense qu'il est impossible d'obtenir est un tableau prvalue, n'est pas? –

+1

@ Peregring-lk oui c'est une valeur x maintenant (pas au moment de la réponse). Et dans 'alias {1, 2, 3}' l'expression est à la fois une valeur x et une valeur prvalue.D'abord c'est une prvalue sans objet associé, et quand vous y indexez, la "conversion de matérialisation" crée un objet pour elle et donne à l'expression valeur-catégorie "xvalue", avant de pointer sur le premier élément du tableau. –