У меня есть следующий код. Есть функция, которая принимает два типа int32. Затем я беру указатель на него и приводю к функции, которая принимает три int8, и вызываю ее. Я ожидал ошибку во время выполнения, но программа работает нормально. Почему это вообще возможно?
main.cpp:
#include <iostream>
using namespace std;
void f(int32_t a, int32_t b) {
cout << a << " " << b << endl;
}
int main() {
cout << typeid(&f).name() << endl;
auto g = reinterpret_cast<void(*)(int8_t, int8_t, int8_t)>(&f);
cout << typeid(g).name() << endl;
g(10, 20, 30);
return 0;
}
Выход:
PFviiE
PFvaaaE
10 20
Как я вижу, сигнатура первой функции требует двух целых, а вторая функция требует трех символов. Char меньше, чем int, и мне было интересно, почему a и b по-прежнему равны 10 и 20.