[以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);
}
因此出现两个问题:
(&)
的作用是什么?删除会触发error: creating array of references
,这似乎是被禁止的myUsage
签名怎么了?
- (&)代表什么?
它将参数作为参考。如果不是引用,那么它将是一个数组。但是函数参数不允许为数组,并且此类声明被调整为指向数组元素的指针。由于此类型不包含有关数组大小的信息,因此对大小的缩减没有用。
删除将触发错误:创建引用数组,这似乎是被禁止的
void myUsage(T & arr [N])
实际上,括号是强制性的。需要使用它们来表示引用适用于数组,而不适用于数组的元素类型。 T&[N]
是引用数组(不允许),而T(&)[N]
是引用数组。
- myUsage签名出了什么问题?
不允许引用数组。
[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()