W tym bardzo interesującym przypadku wykorzystywania wnioskowania wartości powrotnej (pobrane z: https://www.geeksforges.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;
}

Nie byłoby wyładunku wartości zwracanej w czasie wykonywania, ponieważ parametry A i B nie są nieustannymi wyrażeniami, które można ocenić w czasie kompilacji? To znaczy, wartość powrotowa musiałaby być typem typu lub b dla każdego połączenia funkcji instancji, ale nie jest jasne w czas kompilacji , który jest. a & lt; b ? A: B nie jest ciągłym wyrażeniem?

Nie byłoby to średnie C ++ jest dynamicznie wpisanym językiem. Jeśli nie, jaka jest wartość powrotowa funkcji wywnioskowana w czasie kompilacji? Są dwiema funkcjami utworzonymi na instancję, która zwraca typ i inny, który zwraca typ B? Jak by to działało?

2
Matias Chara 25 lipiec 2020, 22:56

1 odpowiedź

Najlepsza odpowiedź

Otrzymasz jedną funkcję, która zwraca wartość wspólnego typu A i B. C ++ jest statycznie wpisanym językiem, więc typ cond ? a : b powinien być znany w czasie kompilacji. Są Reguły specjalne do określenia tego wspólnego typu. Nieformalnie mówiąc, jest to typ, który A i B może być niejawnie przekształcona. Jeśli nie istnieje taki typ, otrzymasz błąd kompilacji.

Na przykład,

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

Typ c zawsze będzie double. Jeśli a jest mniejsza niż b, wartość powrotowa będzie a przekonwertowana w double, jak static_cast<double>(a).

2
Evg 25 lipiec 2020, 20:33