Стандарт не требует, чтобы это работало.Стандарт требует, чтобы char*
и void*
имели одинаковые требования к представлению и выравниванию, все указатели на структуры это делают и все указатели на объединения тоже.Хотя в любом случае вызывать указатель приведенной функции в любом случае не определено (§6.5.2.2p9), те же самые требования представления и выравнивания дают практическую гарантию того, что вызов работает (§6.2.5p27).
Другие типы указателей не должны вести себя таким образом, хотя я лично не встречал такую машину.Теоретически возможно, что int*
имеет меньшее sizeof
, чем, например, char*
(если int
имеет более строгие требования к выравниванию, чем char
, это может быть разумным решением).При правильном соглашении о вызовах на такой машине было бы практически невозможно вызвать указатель приведенной функции.