Size: a a a

2020 November 27

AS

Alex Sandrov in pro.cxx
Ilia Zviagin
Ещё раз, тебе они не нужны
Ну я про что и говорю. Но кто-то, получается, использует. Например, для type erasure (которое само себе на хвост наступает)
источник

m

magras in pro.cxx
Андрей Руссков
ну да. Речь же о том как получить указатель на функцию не стукнувшись нигде в стандарте? )
Нет, речь шла о касте указателя на функцию в void*.
источник

АР

Андрей Руссков... in pro.cxx
а, и он так же не определен? Хм
источник

IZ

Ilia Zviagin in pro.cxx
Alex Sandrov
Ну я про что и говорю. Но кто-то, получается, использует. Например, для type erasure (которое само себе на хвост наступает)
НЕ ДЛЯ ФУНКЦИЙ это
источник

IZ

Ilia Zviagin in pro.cxx
Андрей Руссков
а, и он так же не определен? Хм
В некоторых системах код ВООБЩЕ МОЖЕТ ЛЕЖАТЬ В ДРУГОЙ ПАМЯТИ, чем данные. И у них будут разные указатели.
источник

АР

Андрей Руссков... in pro.cxx
да, я в курсе
источник

АР

Андрей Руссков... in pro.cxx
даже разного размера указатели
источник

AS

Alex Sandrov in pro.cxx
Ilia Zviagin
НЕ ДЛЯ ФУНКЦИЙ это
Да нет разницы. Люди используют void* как универсальный способ перетащить что-то из одного места в другое. В этом суть проблемы
источник

АР

Андрей Руссков... in pro.cxx
собственно, поэтому каст указателя на функцию в void* и не определен
источник

АР

Андрей Руссков... in pro.cxx
Alex Sandrov
Да нет разницы. Люди используют void* как универсальный способ перетащить что-то из одного места в другое. В этом суть проблемы
суть проблемы не в том, что люди используют ID-способ, а в том, что гарантированного стандартом способа нет
источник

АР

Андрей Руссков... in pro.cxx
(кроме std::function)
источник

AS

Alex Sandrov in pro.cxx
Андрей Руссков
суть проблемы не в том, что люди используют ID-способ, а в том, что гарантированного стандартом способа нет
ну я так и сказал :)
люди пользуются ID-способом, потому что нету способа, гарантированного стандартом
источник

IZ

Ilia Zviagin in pro.cxx
Alex Sandrov
Да нет разницы. Люди используют void* как универсальный способ перетащить что-то из одного места в другое. В этом суть проблемы
Есть разница
источник

AS

Alex Sandrov in pro.cxx
Ilia Zviagin
Есть разница
Какая?
источник

IZ

Ilia Zviagin in pro.cxx
выше
источник

AS

Alex Sandrov in pro.cxx
Ilia Zviagin
выше
Ну это получается, разница из области: "50% подорваться vs 90% подорваться" ?
источник

d

disba1ancer in pro.cxx
Type erasure для указателей на функцию? Вроде указатели на функции можно между собой кастить, только перед вызовом надо кастануть к исходному типу
источник

АР

Андрей Руссков... in pro.cxx
disba1ancer
Type erasure для указателей на функцию? Вроде указатели на функции можно между собой кастить, только перед вызовом надо кастануть к исходному типу
а каст какого-нить int(*)(int) в void(*)() определен лучше чем в void*?
источник

AT

Alexander Tulikov in pro.cxx
Переслано от Александр Караев...
вообще, быстрое гугление показало, что каст указателя на функцию к void* может быть невалиден.

а вот стирание типа через каст в void(*)() должно прокатить:
https://eel.is/c++draft/expr.compound#expr.reinterpret.cast-6
источник

АР

Андрей Руссков... in pro.cxx
Погодите, там даже интереснее

8.5.1.10.8:
Converting a function pointer to an object pointer type or vice versa is conditionally-supported. The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both directions, converting a prvalue of one type to the other type and back, possibly with different cv-qualification, shall yield the original pointer value.

"Conditionally supported" != "implementation defined". Если реализация поддерживает такой каст, то он должен сработать ожидаемо
источник