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