2010-09-07 12 views
7

$ 4.2/1 - "An lvalue o rvalue de tipo ‘array de N T’o‘variedad de desconocido unido de T’puede ser convertido en un rvalue de tipo‘puntero a T.’ El resultado es un puntero al primer elemento de la matriz. "matriz y RValue

No estoy seguro de cómo obtener un rvalue de un tipo de matriz que no sea durante la inicialización/declaración?

+1

posible duplicado de [Creo que se me ocurrió un ejemplo de rvalue del tipo de matriz] (http://stackoverflow.com/questions/4058151/i-think-i-may-have-come-up- with-a-example-of-rvalue-of-array-type) –

Respuesta

-2

No se puede obtener un rvalue del tipo de matriz. Las matrices solo pueden ser lvalues, y siempre que se utilizan en un valor l decaen a un puntero al primer elemento.

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

La expresión array en [1] es un lvalue de tipo int (&)[10] que se convierte a un valor p de tipo int *p, es decir, la matriz rvalue de N == 10 t == int se convierte a un lvalue del tipo puntero a T == int.

+0

¿Puede mostrarme un ejemplo en el que la cita anterior es válida para un tipo Rvalue of Array? – Chubsdad

+0

¿Es esa la razón por la cual las funciones no pueden devolver los tipos de matriz? –

+0

@Cedric H .: En §8.3.5 [dcl.fct]/3 el estándar especifica que * Después de determinar el tipo de cada parámetro, cualquier parámetro de tipo "array of T" o "function returning T" se ajusta para ser "Puntero a T" o "puntero a función que devuelve T", respectivamente. * Es decir, el estándar especifica que 'void foo (char [10])' es una declaración exactamente equivalente a 'void foo (char \ *)' - - eso es por argumentos. Luego, en §8.3.5/6 dice: * Las funciones no deben tener un tipo de retorno de tipo array o función, aunque pueden tener un tipo de retorno de tipo puntero o referencia a tales cosas *. para los tipos de devolución –

-2

¿Estaría la oportunidad de demostrar 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 no es un tipo de matriz ... es un puntero a una matriz. –

10

No estoy seguro de a qué se refiere por "initialization/declaration" en este contexto. En lo siguiente, la matriz es un prvalue

template<typename T> using alias = T; 

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

Esto se puede verificar por decltype(alias<int[]>{1, 2, 3}) tener el tipo int[3]. La creación de matrices de esta manera sobre la marcha no se pensó inicialmente para funcionar, sino que se deslizó en el borrador de trabajo a propósito del trabajo relacionado sobre la inicialización uniforme. Cuando me di cuenta de que algunos párrafos en el borrador de trabajo de C++ 0x desaprobaban un caso especial de esta creación sobre la marcha de arreglos temporales de matriz mientras que otros párrafos lo permitían, envié un informe de defectos al comité de C++, que luego sobre la base de la implementación parcialmente operativa de GCC decidió apoyarlo completamente.

+0

Para ser más específicos, en la redacción actual, 'f(). Array' es un xvalor no? Lo que creo que es imposible de obtener es un prvalue de matriz, ¿no es así? –

+1

@ Peregring-lk sí, es un valor x ahora (no en el momento de la respuesta). Y en 'alias {1, 2, 3}' la expresión es tanto un valor x como un valor pr.En primer lugar, es un valor prve sin un objeto asociado, y cuando lo indexa, la "conversión de materialización" crea un objeto para él y le da a la expresión valor-categoría "xvalor", antes de tomar un puntero al primer elemento de la matriz. –

Cuestiones relacionadas