C++标准库函数 end 的实现原理(非类型模板参数)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++标准库函数 end 的实现原理(非类型模板参数),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1047字,纯文字阅读大概需要2分钟。
内容图文
![C++标准库函数 end 的实现原理(非类型模板参数)](/upload/InfoBanner/zyjiaocheng/735/88fea4f0c9184e5abd56927ce5214050.jpg)
在刚开始学习《C++ Primer》的时候遇到了 end 函数,感觉很神奇,但又很迷惑:为什么能获得数组的尾后指针呢?编译器也不会在内存中申请一块空间放数组元素的个数啊!最近再一次遇到了 end 就看了一下它的实现终于明白了。
先说以下C语言中获得数组元素个数的方法。
int arr[] = {1, 2, 3}; size_t n = sizeof(arr) / sizeof(int); //n为元素个数
sizeof 返回一个常量表达式,是在编译时期确定返回值的。也就是说在编译时期是可以知道数组的长度的。
再看看 C++标准库中 end 的实现(关键部分:非类型模板参数 N 及函数形参):
//编译器再编译时期会根据数组的元素个数来代替N,从而实例化模板 template<typename T, size_t N> inline constexpr T* end(T (&arr)[N]) { //由于不能拷贝一个数组,所以将参数定义为了数组的引用 return arr + N; //指针和一个整数N(数组元素个数)相加,从而返回数组arr的尾后指针 }
模板参数列表中的 N 是一个非类型模板参数,而非类型模板参数是在编译时期被确定的常量表达式。end 函数的形参是一个(长度为N)数组的引用,因为 N 是一个非类型模板参数,所以编译器会在编译时期(前面说过,在编译时期是可以确定数组长度的)用数组的长度来初始化 N。最后将 arr 和 N 相加即获得了数组的尾后指针。
内容总结
以上是互联网集市为您收集整理的C++标准库函数 end 的实现原理(非类型模板参数)全部内容,希望文章能够帮你解决C++标准库函数 end 的实现原理(非类型模板参数)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。