如果在模板函数中通过const引用传递,则数组不会衰减到指针

时间:2011-08-24 14:31:39

标签: c++ arrays

这个问题来自这个问题:

c++ pass array to function question

但是由于OP接受了答案,我想现在没有人会读它。

我在g ++上尝试了这段代码。看来,当传递给这个函数时,数组不会衰减到指针(该函数返回正确的结果):

#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';
}

另一位用户(sharptooth)表示他在VC ++ 10上具有相同的行为,并且内联了。

有人可以解释一下吗?感谢。

2 个答案:

答案 0 :(得分:12)

数组衰减不仅发生 - 它只发生在程序没有它的情况下无法编译时。当您通过引用传递数组时,根本不需要进行衰减。

请注意,也可以在不分割丑陋的sizeof表达式的情况下编写函数模板:

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

当客户致电size_of_array时,模板机制会自动推断出TN

答案 1 :(得分:4)

你还没有编写接受指针的函数,你已经把它写成接受一个const引用来准确传递给它的argement类型。只有在尝试为指针指定数组值时才会发生指针衰减。