数组大小扣除

Pat*_*oni 1 c++ arrays templates stl c++11

按照 Scott Meyer 的“现代 C++”中的示例,我将利用std::array模板进行大小推导。我在尝试编译我的myUsage函数用法时遇到了困难。

#include <array>
#include <iostream>

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&) [N]) noexcept
{
        return N;
}

void scottUsage()
{
        int b[5];
        std::array<short, arraySize(b)> c;
        std::cout << arraySize(b) << " = " << c.size() << "\n";
}

template <typename T, std::size_t N>
void myUsage(T & arr [N])
{
        for (auto i=0; i<arraySize(arr); i++)
                std::cout << arr[i] << "\t";
}

int main()
{
        scottUsage();

        int a[7];
        myUsage(a);
}

Run Code Online (Sandbox Code Playgroud)

于是出现了两个问题:

  1. 旁问)是(&)为了什么?删除会触发error: creating array of references,这似乎是被禁止的
  2. myUsage签名有什么问题?

eer*_*ika 6

  1. (&) 有什么用?

它使论点成为参考。如果它不是引用,那么它将是一个数组。但是函数参数不允许是数组,这样的声明被调整为指向数组元素的指针。由于此类型不携带有关数组大小的信息,因此对大小推断没有用。

删除会触发错误:创建引用数组,这似乎是被禁止的

void myUsage(T & arr [N])
Run Code Online (Sandbox Code Playgroud)

事实上,括号是强制性的。需要它们来表示引用适用于数组而不是数组的元素类型。T&[N]是一个引用数组(这是不允许的),而T(&)[N]是对数组的引用。

  1. myUsage 签名有什么问题?

不允许引用数组。