c++ - 采用引用类型参数的函数模板

标签 c++ arrays templates reference

据我所知,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 被推断为数组的元素类型,即 intN 被推断为数组的大小,即 7。请注意,只有在通过引用传递数组时才能推导数组的大小;否则,由于数组到指针的衰减,不会保留大小。

关于c++ - 采用引用类型参数的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58874931/

相关文章:

android - 我可以使用 C 或 C++ 创建 APK 吗?

c++ - % (mod) 混合签名

javascript - 将数组项插入另一个数组中的第 n 个元素

java - 使用散列法查找总长度最小的字符串子数组,该子数组包含原始数组中的所有不同字符串

c++ - 类模板中 std::array 的大小取决于模板参数

c++运行时模板参数识别

templates - 如何使用Beam 2.0创建Dataflow模板管道?

模板方法构造函数中的 C++ 奇怪行为

c++ - friend 函数之前的不合格ID

将 int(32 位)转换为 char(8 位)