Здравствуйте, rg45, Вы писали:
R>Конечно легален. Только ты походу не совсем понял, о чём мы вели речь. Началось всё с выражения: (flag ? sin : cos)(x), в котором тернарный оператор вычисляется в указатель на функцию. Потом мы плавно перешли к следующему: допустим у нас есть выражение, имеющее вид функционального вызова f(...). Вопрос: в каких случаях имя f преобразуется в указатель на функцию? Из std::min и std::max ты не получишь указатели на функции и выражение вида (flag ? std::min : std::max)(a, b) тоже не напишешь, хоть со скобками, хоть без, потому что это имена шаблонов, да ещё и перегруженных. Впрочем сишные min/max также не преобразуются в указатели на функции, т.к. это имена макросов. А вот сишные sin/cos преобразуются в т.ч. и в C++.
Не вижу препятствий:
using pT = decltype(y)(*)(decltype(y));
x = (flag ? (pT)std::sin : (pT)std::cos)(y);
using pF = const decltype(y)& (*)(const decltype(y)&,const decltype(y)&);
y = (flag ? (pF)std::min : (pF)std::max)(x, y);
хотя, конечно, столбовая дорога идёт в другом направлении...
Так как
pF mm = std::min; компилируется без варнингов, то я сомневаюсь, что тут есть какие-то запреты.
Кстати, вместо указателей можно ссылки использовать:
using pR = const decltype(y)& (&)(const decltype(y)&,const decltype(y)&);
pR rMin = std::min;
pR rMax = std::max;
y = (flag ? rMin : rMax)(x, y);