数组大小推导

问题描述 投票:0回答:2

[以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);
}

因此出现两个问题:

  1. 附带问题(&)的作用是什么?删除会触发error: creating array of references,这似乎是被禁止的
  2. myUsage签名怎么了?
c++ arrays c++11 templates stl
2个回答
3
投票
  1. (&)代表什么?

它将参数作为参考。如果不是引用,那么它将是一个数组。但是函数参数不允许为数组,并且此类声明被调整为指向数组元素的指针。由于此类型不包含有关数组大小的信息,因此对大小的缩减没有用。

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

void myUsage(T & arr [N])

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

  1. myUsage签名出了什么问题?

不允许引用数组。


0
投票

[myUsage()需要使用T (&arr) [N]

template <typename T, std::size_t N>
void myUsage(T (&arr) [N])

括号告诉编译器该引用适用于数组本身,而不适用于数组的元素类型。

此外,arraySize()myUsage()都应引用const数据:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(const T (&) [N]) noexcept
...
template <typename T, std::size_t N>
void myUsage(const T (&arr) [N])

BTW,从C ++ 17开始不需要arraySize(),请改用std::size()

std::size()
© www.soinside.com 2019 - 2024. All rights reserved.