Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

array doesn't decay to pointer if passed by const reference in a template function

Tags:

c++

arrays

This question comes from this one:

c++ pass array to function question

but since the OP accepted an answer I guess nobody will read it now.

I tried this code on g++. It seems that the array does not decay to a pointer when passed to this function (the function returns the proper result):

#include <iostream>

template <typename T>
std::size_t size_of_array (T const & array)
{
   return sizeof (array) / sizeof (*array);
}

int main ()
{
    int a [5];
    std::cout << size_of_array (a) << '\n';
}

Another user (sharptooth) said he have the same behavior on VC++ 10 with inlining off.

Can somebody explain? Thanks.

like image 487
Nicolas Grebille Avatar asked Aug 24 '11 14:08

Nicolas Grebille


2 Answers

Array decay doesn't just happen -- it only happens when the program would fail to compile without it. When you pass an array by reference, there simply is no need for decay to kick in.

Note that the function template can also be written without dividing ugly sizeof expressions:

template <typename T, std::size_t N>
std::size_t size_of_array(T (&array)[N])
{
    return N;
}

When a client calls size_of_array, T and N are automatically deduced by the template machinery.

like image 108
fredoverflow Avatar answered Nov 12 '22 22:11

fredoverflow


You haven't written the function to accept a pointer, you've written it to accept a const reference to exactly the type of argement that's passed to it. Pointer decay only happens if you try to assign to a pointer the value of an array.

like image 45
Benjamin Lindley Avatar answered Nov 13 '22 00:11

Benjamin Lindley