为何C++获取数组大小的模板函数无法作用于运行时指定长度数组
编译报错原因
tell_me_size模板函数从实现逻辑上就只支持编译期长度固定的数组,碰到运行时指定长度的数组编译失败,是C++语法规则决定的:
- 首先是非类型模板参数的硬性限制
模板定义里的int n属于非类型模板形参,C++标准明确要求,传入这类形参的实参必须是编译阶段就能确定的常量表达式。
传入固定长度数组int a[4]时,长度4是代码里写死的编译期常量,编译器可以自动推导出模板参数T=int、n=4,实例化出对应版本的函数,所以能正常运行,对应测试代码如下:int a[4]; cout<< tell_me_size(a)<<endl; - 其次是变长数组本身的特性不符合模板要求
你写的运行时指定长度的数组代码如下:
这种int n; cin>>n; int a[n]; cout<< tell_me_size(a)<<endl;int a[n]的写法叫变长数组(VLA),是C99标准引入的特性,标准C++从未支持过该语法,目前部分C++编译器能兼容这种写法只是厂商做的扩展。这类数组的长度是程序运行到读入n的步骤时才确定的,编译阶段编译器根本拿不到n的具体值,自然没法给模板的非类型参数n推导出合法的编译期常量,找不到匹配的模板实例,就会抛出no matching function for call to ‘tell_me_size(int [n])的错误。
补充:哪怕开启编译器扩展支持变长数组,也没法用这个模板获取它的长度。这个模板的实现原理就是编译期提取数组长度信息,从设计上就不可能适配长度在运行时才确定的数组。
内容的提问来源于stack exchange,提问作者Adarsh Singh
相关产品推荐
相关产品推荐

