c++ - resueltos - que es scanf
¿Puedo escribir un tipo de función que devuelva una función? (1)
Estás pasando una ID de tipo , que se define en [dcl.name] como
[…] Sintácticamente una declaración para una variable o función de ese tipo que omite el nombre de la entidad. [...] Es posible identificar únicamente la ubicación en el declarador abstracto donde aparecerá el identificador si la construcción fuera un declarador en una declaración. El tipo nombrado es el mismo que el tipo del identificador hipotético.
Para que el identificador hipotético tenga algún tipo, la declaración hipotética debe estar bien formada en primer lugar. Pero no es según [dcl.fct]/10 . Por lo tanto, el programa está mal formado (y los mensajes de error de los compiladores son realmente comprensibles). Este caso también está más directamente cubierto por [temp.deduct]/(8.10) , lo que implica que se trata de un error (compatible con SFINAE).
De hecho, simplemente implica que el uso de un tipo no válido es suficiente para que el programa no esté bien formado. Por ejemplo, la creación del puntero de tipo a la función de retorno de la función está mal formada:
using f = int();
using t = f(*)();
Así es el siguiente:
struct A {virtual void f() = 0;};
using t = A(*)();
(Clang no debería estar aceptando esto. Cf GCC bug 17232 es una interesante discusión).
Lo siguiente no compila en gcc y clang
#include <type_traits>
int foo();
int main()
{
using R = std::result_of_t<decltype(foo)()>; // error
}
El error en ambos compiladores se refiere a la ilegalidad de declarar una función que devuelve una función. Pero no estoy declarando tal función, solo estoy tratando de escribir su tipo, ya que eso es lo que el result_of
espera. ¿Es esto realmente mal formado?