Собственно почему sizeof(x) в main() возвращает 32 а в функции 5?
Вот код:
#include <iostream>
#include <cstdlib>
using namespace std;
//template <class sum>
inline void fcn(double x[], double& res)
{
for(int i = sizeof(x); i != 0; ) //Why sizeof(x) returs 4 instead of 32?
{
res += x[--i];
//cout << res << " " << x[i] << " " << i << endl;
}
}
int main(void)
{
double x[] = {2, 2, 2, 2};
double res = 0;
fcn(x, res);
cout << res ;
system ("pause");
return 0;
}

Потому что это параметр функции, даже явное добавление размера не спасет ситуацию.
Вот что пишет в warnings, например, LLVM/clang:
Users/..../main.cpp:13:19: Sizeof on array function parameter will return size of 'double *' instead of 'double []'
<EDIT>при передачи параметра-массива в функцию обычно просто указатель суется в стек или регистры, потому так и сделано в Стандарте. Не зря же язык Си "машинно-независимым ассемблером" называют</EDIT>
Используйте std::vector вместо массивов, если задача на плюсах нормально научиться писать стоит.
Ну и по мелочам: return 0; из main происходит сам по себе, значит, если используете правило хорошего тона "не писать лишний код, пользоваться кодом, сгенеренным по умолчанию", то return 0 там лишний. И у меня он на паузу выругался (нет такой команды, кстати, это единственная непортируемость в Вашем коде) , в этом плане лучше через cin что-нибудь ввести.
Потому что, внутри главной функции определяется размер массива. Т. е. 4-е ячейки по 8 байт (тип дабл) . А в функции фсн параметром является не массив, а указатель на первый байт массива. Адрес указателя на первый элемент массива помещается в ячейку типа интеджер. Ячейка типа интеджер размером 4-е байта.
---------------------
Т. е. в первом случае определяется размер массива состоящего из четырёх ячеек размером по 8 байт. А во втором случае определяется размер одной ячейки в четыре байта.
------------------------
Кури о передаче функции указателя.
============================================
Могу и ошибаться. Забыл уже.