c++ auto decltype c++14

c++ - SFINAE y decltype(auto)



auto c++ (2)

pero la declaración de devolución estaría mal formada, ¿resulta SFINAE?

La proposal-n3638 dice:

SFINAE

Dado que el tipo de retorno se deduce mediante la creación de instancias de la plantilla, si la creación de instancias está mal formada, esto causa un error en lugar de una falla de sustitución . Esto permite que una función automática devuelva un lambda, lo que no es posible utilizando el patrón decltype (expresión devuelta).

Espero que eso sea lo que estás buscando.

Si una plantilla de función devuelve decltype(auto) (u otro especificador de tipo que usa auto ) pero la declaración de retorno no está bien formada, ¿resulta SFINAE? ¿Se considera que la declaración de return es el contexto inmediato de la firma de función?

Nada en el borrador N3690 parece requerir esto. Por defecto, supongo que SFINAE no se aplica.

Esto parece desafortunado porque puede escribir una función para reenviar a otra función, pero no puede condicionar su existencia al delegado como cuando escribe a mano. Además, la verificación de la existencia de una función miembro no decltype(auto) entre pares no se puede hacer sin decltype(auto) porque no se puede usar en una firma de función. Sin embargo, esto indica un problema fundamental, ya que decltype(auto) proporciona una ruta para considerar el tipo de clase como completo dentro de la firma de un miembro, donde no lo es.

¿Se ha escrito una propuesta o se ha analizado formalmente el problema en alguna parte?

La capacidad de tratar el tipo de clase como completo dentro de la firma de un miembro puede tener otras implicaciones ... pero eso es sólo el forraje para otra pregunta.


Siguiendo el enlace de Nawaz, las preguntas restantes son respondidas por N3690 §7.1.6.4 / 11:

Si el tipo de una entidad con un tipo de marcador de posición no definido es necesario para determinar el tipo de una expresión, el programa está mal formado.

Esto significa que incluso si SFINAE trabajó con la deducción del tipo de retorno, no podría utilizarse para consultar una declaración de función de otra. La firma es esencialmente inválida hasta que se procesa la declaración de return , que se produce en el corchete de cierre de la definición de la class {} , y después de que se hayan procesado las definiciones de los miembros anteriores.

En cierto sentido, todas las decltype(auto) miembro decltype(auto) están incompletas con respecto a las funciones precedentes en la misma clase:

struct s { void f() { a(); } // error: use of ‘auto s::a()’ before deduction of ‘auto’ auto a() { return 3; } };

Esta es la queja de GCC; desaparece si las declaraciones de los miembros se invierten. Esto se debe a que las definiciones de funciones se procesan en orden de declaración, cuando se alcanza el } de la definición de clase. Si la declaración a(); Se procesa antes de la return 3; , entonces el programa está mal formado.