rvalue referencia a la función

typedef void(&&RF)(void* p); RF rf() { return f; } int ay[10] = { 0 }; typedef int(&&RA)[10]; RA ra() { return ay; // error } cout << is_lvalue_reference::value << endl; // 1 

La referencia de C ++ dice que “las referencias de rvalue a las funciones se tratan como lvalues, se nombren o no”.

¿Pero no puedo entender cuáles son las consideraciones para esto? Supongo que quizás el nombre de la función sea siempre un valor l. Por lo tanto, debe mantener su atributo de valor l y asegurarse de pasar el nombre de la función a cualquier lugar donde se pueda invocar, como rf()(NULL) . Entonces el nombre de la matriz vino inesperadamente a mi mente. Creo que siempre es un valor igual, así que escribí el código anterior para probar esto y obtuve un error.

¿Quién puede señalar la verdadera razón detrás de todo esto?

En N3055 se discute brevemente el tema de las referencias de valor a las funciones:

Además, las referencias de rvalue (como las referencias de lvalue tradicionales) pueden vincularse a funciones. Sin embargo, tratar un valor de retorno de referencia de rvalue como un valor de r, introduce el concepto nuevo de un valor de función en el lenguaje. Anteriormente no existía tal idea: una función lvalue utilizada en un contexto de rvalue se convierte en un valor de puntero a función, no una función rvalue, por lo que el borrador actual de la Norma no describe cómo deben tratarse dichos valores. En particular, las llamadas de función y las conversiones a los punteros de función se especifican en términos de valores de función, por lo que la mayoría de los usos plausibles de las referencias de valor a funciones están indefinidas en la redacción actual.

Las funciones no tienen duración de vida o almacenamiento, por lo que la distinción lvalue / rvalue no tiene sentido para ellas. Por otro lado, si permite que existan valores de función, debe resolver los problemas tratados en el párrafo citado. A la luz de esto, obligar a todos los valores de función a ser valores de l me parece haber sido una solución razonable.

Otra solución, supongo, habría sido prohibir completamente los valores de función, por lo que cualquier bash de crear una referencia de valor a tipo de función resultaría en un progtwig mal formado. No sé si este enfoque fue considerado, pero supongo que causaría inconvenientes con la progtwigción genérica.

Por otro lado, para cualquier tipo de objeto, incluidos los tipos de matriz, hay una distinción significativa entre valores y valores. Por lo tanto, el lenguaje le prohíbe vincular una referencia rvalue a un tipo de objeto a un lvalue de tipo de objeto. No estoy seguro de por qué te sorprende que tu código no se compile.