C++中如何用sizeof()获取数组引用大小?无大小参数为何报错?
为什么未指定大小的数组引用无法使用
sizeof()? 要搞清楚这个问题,得从C++里数组类型的完整性和sizeof的要求说起:
核心原因:不完整类型无法使用sizeof
- 你在
main里声明的arr,编译器通过初始化列表能推导出它的类型是double[6]——这是一个完整类型,编译器明确知道它的大小(6个double的总字节数),所以sizeof(arr)能直接计算出结果。 - 而函数参数里的
double (&list)[],是对**未知大小的数组(不完整类型)**的引用。sizeof操作符要求操作数必须是完整类型,因为它需要明确知道类型的内存占用细节才能计算大小。对于不完整的数组类型,编译器没有足够的信息,自然会报错。
为什么指定大小后就能正常工作?
当你把参数改成double (&list)[6]时,这个引用的类型变成了对**完整数组类型double[6]**的引用。此时编译器明确知道数组的大小,sizeof(list)就能正常计算出整个数组的总字节数,和main里sizeof(arr)的结果一致。
适配任意大小数组的解决方案
如果想让函数既能接收任意大小的数组,又能通过引用获取数组大小,可以用模板让编译器自动推导数组的大小:
#include <iostream> template <size_t N> double sum(double (&list)[N]){ double total{}; std::cout << "the size is : " << sizeof(list) << std::endl; for(size_t i{} ; i < N ; i++){ total += list[i]; } return total; } int main(){ double arr[]{34.5, 67.8, 92.345, 8.1234, 12.314, 3.4}; double result{}; std::cout << "size of the array : " << sizeof(arr) << std::endl; result = sum(arr); // 无需手动传size,编译器自动推导N=6 std::cout << "the total is " << result << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者semicolon_missing
相关产品推荐
相关产品推荐

