具有引用类型参数的功能模板

时间:2019-11-15 10:21:38

标签: c++ arrays templates reference

据我所知,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)]; ?令人困惑。

1 个答案:

答案 0 :(得分:2)

使用(&)时,将参数类型声明为引用,而不是数组(或指针)。然后T(&)[N]声明对数组的引用,该数组具有N类型的T个元素。

当您传递keyVals时,T被推导为数组的元素类型,即int;推导N作为数组的大小,即7。请注意,只有在按引用传递数组时才可以推断出数组的大小。否则,由于数组到指针的衰减,大小将不会保留。