Сообщение Re[16]: C++ illegal instruction от 20.08.2025 18:09
Изменено 20.08.2025 18:36 rg45
Re[16]: C++ illegal instruction
Здравствуйте, B0FEE664, Вы писали:
R>>А тут уж без вариантов будет функция — не шаблон, не перегрузка и не функциональный объект. Вот если написать std::sin и std::cos, тогда получится облом.
BFE>Это почему?
BFE>Неужели старый трюк ухода от макроса
BFE>
BFE>больше не легален?
Конечно легален. Только ты походу не совсем понял, о чём мы вели речь. Началось всё с выражения: (flag ? sin : cos)(x). Потом это свелось к следующему: допустим у нас есть выражение, имеющее вид функционального вызова f(...). Вопрос: в каких случаях имя f преобразуется в указатель на функцию? Из std::min и std::max ты не получишь указатели на функции и выражение вида (flag ? std::min : std::max)(a, b) тоже не напишешь, хоть со скобками, хоть без, потому что это имена шаблонов, да ещё и перегруженных. Впрочем сишные min/max также не преобразуются в указатели на функции, т.к. это имена макросов. А вот сишные sin/cos преобразуются в т.ч. и в C++.
R>>А тут уж без вариантов будет функция — не шаблон, не перегрузка и не функциональный объект. Вот если написать std::sin и std::cos, тогда получится облом.
BFE>Это почему?
BFE>Неужели старый трюк ухода от макроса
BFE>
BFE>a = (std::min)(a, b);
BFE>b = (std::max)(a, b);
BFE>
BFE>больше не легален?
Конечно легален. Только ты походу не совсем понял, о чём мы вели речь. Началось всё с выражения: (flag ? sin : cos)(x). Потом это свелось к следующему: допустим у нас есть выражение, имеющее вид функционального вызова f(...). Вопрос: в каких случаях имя f преобразуется в указатель на функцию? Из std::min и std::max ты не получишь указатели на функции и выражение вида (flag ? std::min : std::max)(a, b) тоже не напишешь, хоть со скобками, хоть без, потому что это имена шаблонов, да ещё и перегруженных. Впрочем сишные min/max также не преобразуются в указатели на функции, т.к. это имена макросов. А вот сишные sin/cos преобразуются в т.ч. и в C++.
Re[16]: C++ illegal instruction
Здравствуйте, B0FEE664, Вы писали:
R>>А тут уж без вариантов будет функция — не шаблон, не перегрузка и не функциональный объект. Вот если написать std::sin и std::cos, тогда получится облом.
BFE>Это почему?
BFE>Неужели старый трюк ухода от макроса
BFE>
BFE>больше не легален?
Конечно легален. Только ты походу не совсем понял, о чём мы вели речь. Началось всё с выражения: (flag ? sin : cos)(x), в котором тернарный оператор вычисляется в указатель на функцию. Потом мы плавно перешли к следующему: допустим у нас есть выражение, имеющее вид функционального вызова f(...). Вопрос: в каких случаях имя f преобразуется в указатель на функцию? Из std::min и std::max ты не получишь указатели на функции и выражение вида (flag ? std::min : std::max)(a, b) тоже не напишешь, хоть со скобками, хоть без, потому что это имена шаблонов, да ещё и перегруженных. Впрочем сишные min/max также не преобразуются в указатели на функции, т.к. это имена макросов. А вот сишные sin/cos преобразуются в т.ч. и в C++.
R>>А тут уж без вариантов будет функция — не шаблон, не перегрузка и не функциональный объект. Вот если написать std::sin и std::cos, тогда получится облом.
BFE>Это почему?
BFE>Неужели старый трюк ухода от макроса
BFE>
BFE>a = (std::min)(a, b);
BFE>b = (std::max)(a, b);
BFE>
BFE>больше не легален?
Конечно легален. Только ты походу не совсем понял, о чём мы вели речь. Началось всё с выражения: (flag ? sin : cos)(x), в котором тернарный оператор вычисляется в указатель на функцию. Потом мы плавно перешли к следующему: допустим у нас есть выражение, имеющее вид функционального вызова f(...). Вопрос: в каких случаях имя f преобразуется в указатель на функцию? Из std::min и std::max ты не получишь указатели на функции и выражение вида (flag ? std::min : std::max)(a, b) тоже не напишешь, хоть со скобками, хоть без, потому что это имена шаблонов, да ещё и перегруженных. Впрочем сишные min/max также не преобразуются в указатели на функции, т.к. это имена макросов. А вот сишные sin/cos преобразуются в т.ч. и в C++.