为什么c++函数可以正确return数组的大小?

Why the c++ function can return array’s size correctly?

我正在学习关于 constexpr 的 c++11。 所以我去了网站并学习了如何编码。当我学习如何编码时。我提出了一个关于 return 数组大小函数的问题。以为是函数式的,就是不知道怎么写。 这是我的代码:

#include <iostream>

constexpr auto newline = "\n";

template < typename Type , uint32_t SZ>
constexpr uint32_t len(const Type (&array)[SZ])
{
    return SZ;
}

int main()
{
    int* ptr = new int (9);
    int array[] = {1,2,3,4,5,*ptr};
    std::cout << len(array) << newline;
}
/*
Output:
6

*/

我想知道为什么 len 函数 return 数组的大小正确。

  • 数组的类型为 int[6](我知道您在声明中省略了 [6],但这仍然是正确的)
    • 注意大小是类型的一部分
  • 通过引用传递数组可防止衰减为指针
    • 引用类型是 int (&)[6](您添加了一个 const 作为衡量标准)
  • 函数实际上是一个模板,取const T (&)[N],其中TN都是参数
    • 像这样的模板调用可以推导出个模板参数,所以N会被自动检测到!
    • 你也可以打电话给 len<int, 6>(array),但那更没有意义......
  • N 的值然后作为简单数字从函数返回。

N 应该是 std::size_t,但不是 std::uint32_t

SZ 是模板参数。编译器知道用于实例化模板的参数。

参数不需要显式指定,因为它可以从非模板参数的类型推导出来array。参数表达式的类型是 int[6]。请注意,数组的大小是数组类型的一部分。

为了进一步学习,我建议学习主题 "template argument deduction"。