Безопасных приведений нет.
Ответ в соответствии со стандартом c ++ дан другим ответом, здесь я хочу объяснить, почему это так.
Существуют разные способы обработкивозвращаемые значения, C / C ++ не определяет и не ограничивает способы обработки возвращаемых значений.Они определены внутри ABI.
В X86 ABI определено несколько соглашений о вызовах, например cdecl
, stdcall
или thiscall
.Различные соглашения о вызовах обрабатывают возвращаемые значения по-разному, наиболее важным здесь является то, что где хранятся возвращаемые значения.
Если возвращаемые значения хранятся внутри стека, вызывающая сторона должна настроить указатель стека после получения возвращаемых значений.В этом случае, если вы преобразовали возвращаемые значения в void, то вызывающая сторона не сможет настроить указатель стека, в общем случае поврежден стек, что в большинстве случаев приведет к сбою.
Если возвратзначения хранятся внутри регистров, вызывающий может предположить, что эти регистры не были изменены при вызове функции, возвращающей void, но если это не так, эти регистры могут быть изменены вызываемым пользователем.Разногласия могут также привести к сбою.
Если вы настаиваете на использовании приведения типа, просто убедитесь, что вы выбрали правильное соглашение о вызовах, которое не влияет на возвращаемые значения.