En este caso de uso muy interesante de inferencia de valor de retorno automático (tomado de: https://www.geeksforgeeks.org/type-inference-in-c-auto-and-decltype/):

// A generic function which finds minimum of two values 
// return type is type of variable which is minimum 
template <class A, class B>
auto findMin(A a, B b) -> decltype(a < b ? a : b)
{
    return (a < b) ? a : b;
}

¿No tendría que deducirse el tipo de valor de retorno en tiempo de ejecución porque los parámetros ayb no son expresiones constantes que se pueden evaluar en tiempo de compilación? Quiero decir, el valor de retorno TIENE que ser de tipo A o tipo B para cada llamada de función instanciada, pero no está claro en tiempo de compilación cuál es. a no es una expresión constante, ¿verdad?

¿No significaría esto que C ++ es un lenguaje escrito dinámicamente? Si no es así, ¿cómo se deduce el valor de retorno de la función en el momento de la compilación? ¿Se crean dos funciones por instanciación, una que devuelve el tipo A y otra que devuelve el tipo B? ¿Cómo funcionaría eso?

2
Matias Chara 25 jul. 2020 a las 22:56

1 respuesta

La mejor respuesta

Obtendrá una función que devuelve un valor de tipo común de A y B. C ++ es un lenguaje de tipado estático, por lo que el tipo de cond ? a : b debe conocerse en tiempo de compilación. Existen reglas especiales para determinar ese tipo común. Hablando informalmente, es un tipo al que A y B se pueden convertir implícitamente. Si no existe tal tipo, obtendrá un error de compilación.

Por ejemplo,

int    a = 1;
double b = 2;
auto   c = findMin(a, b);

El tipo de c siempre será double. Si a es menor que b, el valor de retorno será a convertido en double, como si static_cast<double>(a).

2
Evg 25 jul. 2020 a las 20:33