据我所知,C ++中没有引用数组。例如,像T
这样的句子会导致编译错误。
但是,在《有效现代C ++》一书中,我看到了以下代码:
var err ErrNegativeSqrt = float64(1.0) // FAIL!!
我不明白如何以及为什么允许此参数声明。
int& arr[20];
如果执行此语句,T推导为哪种类型? Effective Modern C ++ 说,如果函数模板具有引用类型参数,则T被推导为真实数组类型。那么T的类型是template <typename T, std::size_t N>
constexpr std::size_t arraySize(T(&)[N])
{ ~~~~~~~
return N;
}
?那么N的类型是int keyVals[] = { 1, 3, 7, 9, 11, 22, 35 };
int mappedVals[arraySize(keyVals)];
?令人困惑。
答案 0 :(得分:2)
使用(&)
时,将参数类型声明为引用,而不是数组(或指针)。然后T(&)[N]
声明对数组的引用,该数组具有N
类型的T
个元素。
当您传递keyVals
时,T
被推导为数组的元素类型,即int
;推导N
作为数组的大小,即7
。请注意,只有在按引用传递数组时才可以推断出数组的大小。否则,由于数组到指针的衰减,大小将不会保留。