c++ - 为什么 c++ 函数可以正确返回数组的大小?
问题描述
我正在学习关于 constexpr 的 c++11。所以我去了网站并学习了如何编码。当我学习如何编码时。我提出了一个关于返回数组的大小函数的问题。我认为它是功能性的,但我不知道如何写成这样。这是我的代码:
#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 函数正确返回数组的大小。
解决方案
- 数组有类型
int[6]
(我知道你在声明中省略了[6]
,但这仍然是真的)- 请注意,大小是类型的一部分
- 通过引用传递数组可防止衰减到指针
- 参考类型是
int (&)[6]
(你已经添加了一个const
很好的措施)
- 参考类型是
- 该函数实际上是一个模板,取
const T (&)[N]
其中两个T
和N
都是参数- 像这样的模板调用可以推导出模板参数,所以
N
会被自动检测到! - 你也可以打电话给
len<int, 6>(array)
,但这更没有意义……
- 像这样的模板调用可以推导出模板参数,所以
N
然后从函数返回的值作为一个简单的数字。
N
但是,应该是 a std::size_t
,而不是 a std::uint32_t
。
推荐阅读
- c# - C# - Double 被不必要地转换为 null
- python - Docker:当使用容器名称从一个容器连接到另一个容器时,如何解决“无法将主机名“postgres”转换为地址”?
- sql - SQL Server > 将表从行重新格式化为列?
- python - 如何评估存储在列中的值?
- php - 无法弄清楚为什么我得到 App Engine flex“未捕获的错误:调用未定义的函数 Google\Protobuf\Internal\bccomp()”
- c - 如何用c在mongodb中插入唯一值
- c# - 为什么不同机器上的相同存储库在 Visual Studio 解决方案资源管理器中似乎具有不同的结构?
- excel - Excel SUMIFS 和匹配
- dart - 访问抽象类 dart 中的私有属性
- typescript - 如何在 type-graphql 中为联合类型做一个字段解析器