据我所知,C++ 中没有引用数组。比如int& arr[20];
这样的语句会导致编译错误。
然而,在Effective Modern C++这本书中,我看到了如下代码:
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T(&)[N])
{ ~~~~~~~
return N;
}
我无法理解如何以及为什么允许此参数声明。
int keyVals[] = { 1, 3, 7, 9, 11, 22, 35 };
int mappedVals[arraySize(keyVals)];
如果执行这句话,T 会推导出什么类型? Effective Modern C++ 表示,如果函数模板具有引用类型参数,则 T 被推导出为真正的数组类型。所以T的类型是int[7]
?那么N的类型是int&[7]
?这令人困惑。
最佳答案
使用 (&)
时,参数类型被声明为引用,而不是数组(或指针)。然后 T(&)[N]
声明对数组的引用,该数组有 N
个类型为 T
的元素。
当您传递 keyVals
时,T
被推断为数组的元素类型,即 int
; N
被推断为数组的大小,即 7
。请注意,只有在通过引用传递数组时才能推导数组的大小;否则,由于数组到指针的衰减,不会保留大小。
关于c++ - 采用引用类型参数的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58874931/