Q:

С++ работа с памятью, шаблоны

#include <iostream>

using namespace std;

template <typename type>
int size(type a) {
    return sizeof(a);
}

int main() {
    int a[10] = {5};
    cout << size(a) << " " << sizeof(a) << endl; 
    return 0;
}

Здравствуйте! Пожалуйста можете объяснить почему size(a) возвращает 8, а sizeof(a) - 40? И как внутри шаблона функции получить информацию об использованной массивом памяти? Спасибо!

A:

В данном случае a в шаблоне не будет массивом, так как массивы нельзя передавать по значению, а аргументы-массивы неявно переделываются в аргументы-указатели. В этом можно легко убедиться, добавив в метод проверку:
static_assert(::std::is_same_v<int *, type>);

Для корректного определения размера исходного объекта придется передавать его по ссылке:
template <typename type>
::std::size_t size(type const & a) {
    return sizeof(a);
}

