Re[17]: C++ illegal instruction
От: B0FEE664  
Дата: 20.08.25 19:26
Оценка: +1
Здравствуйте, 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);
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.