Тип у переменной z будет decltype(std::declval<T>()() * std::declval<U>()()) -- это ж интуитивно понятно. В принципе в C++03 тип тоже можно было вывести и без decltype, верней, можно было вывести выражение некого другого типа хранящего в себе информацию о данном типе, а сам тип получить из выражения (для создания переменной данного типа) -- никак (
https://coliru.sta …com/a/968ef0732fe86815)