Acabo de ver a Stephan T. Lavavej hablar CppCon 2018
sobre "Deducción de argumentos de plantilla de clase", donde en algún momento dice por cierto:
En el tipo de C ++ la información casi nunca fluye hacia atrás ... Tuve que decir "casi" porque hay uno o dos casos, posiblemente más pero muy pocos .
A pesar de tratar de averiguar a qué casos se refería, no se me ocurrió nada. De ahí la pregunta:
¿En qué casos el estándar C ++ 17 exige que la información de tipo se propague hacia atrás?
c++
types
language-lawyer
c++17
type-deduction
Massimiliano
fuente
fuente
Respuestas:
Aquí hay al menos un caso:
si lo hace
foo f; int x = f; double y = f;
, la información de tipo fluirá "hacia atrás" para averiguar quéT
hay dentrooperator T
.Puede usar esto de una manera más avanzada:
entonces ahora puedo hacer
y funciona.
Por supuesto, ¿por qué no hacerlo
{1,2,3}
? Bueno,{1,2,3}
no es una expresión.que, sin duda, requieren un poco más de magia: ejemplo en vivo . (Tengo que hacer que la devolución de deduce haga una verificación SFINAE de F, luego haga que F sea compatible con SFINAE, y tengo que bloquear std :: initializer_list en el operador deduce_return_t T.)
fuente
&&
calificador en eloperator T()
es un gran toque; ayuda a evitar la mala interacción conauto
al causar un error de compilación siauto
se usa incorrectamente aquí.Stephan T.Lavavej explicó el caso del que estaba hablando en un tweet :
podemos ver ejemplos de esto en la página cppreference en la dirección de la función sobrecargada , he exceptuado algunos a continuación:
Michael Park agrega :
y proporciona este ejemplo en vivo :
que elaboro un poco más aquí .
fuente
Creo en la transmisión estática de funciones sobrecargadas, el flujo va en la dirección opuesta a la resolución de sobrecarga habitual. Uno de esos está al revés, supongo.
fuente