为什么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]
,其中T
和N
都是参数
- 像这样的模板调用可以推导出个模板参数,所以
N
会被自动检测到!
- 你也可以打电话给
len<int, 6>(array)
,但那更没有意义......
N
的值然后作为简单数字从函数返回。
N
应该是 std::size_t
,但不是 std::uint32_t
。
SZ
是模板参数。编译器知道用于实例化模板的参数。
参数不需要显式指定,因为它可以从非模板参数的类型推导出来array
。参数表达式的类型是 int[6]
。请注意,数组的大小是数组类型的一部分。
为了进一步学习,我建议学习主题 "template argument deduction"。
我正在学习关于 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]
,其中T
和N
都是参数- 像这样的模板调用可以推导出个模板参数,所以
N
会被自动检测到! - 你也可以打电话给
len<int, 6>(array)
,但那更没有意义......
- 像这样的模板调用可以推导出个模板参数,所以
N
的值然后作为简单数字从函数返回。
N
应该是 std::size_t
,但不是 std::uint32_t
。
SZ
是模板参数。编译器知道用于实例化模板的参数。
参数不需要显式指定,因为它可以从非模板参数的类型推导出来array
。参数表达式的类型是 int[6]
。请注意,数组的大小是数组类型的一部分。
为了进一步学习,我建议学习主题 "template argument deduction"。