一个例子理解c++函数模板的编译

一、例子

template <typename T>
inline void callWithMax(const T& a, const T& b){
    f(a > b ? a : b);
}
int main(){
    return 0;    
}

二、理解

  关于函数模板的编译以及函数模板的实例化从这个例子可以得到解答。

  单纯编译上述代码不会产生编译错误,但是明显在callWithMax这个函数模板的函数体中调用了一个没有声明的函数f, 如果callWithMax是一个普通函数, 那么这段代码一定会报一个"error: 'f' is not declared in this scope"的错误。

  可见这段代码编译成功的原因无非是没有对函数体进行编译,这就得说一说函数模板与函数模板的实例化,一个函数模板只有在实例化后才会产生出一个特定的函数, 实例化之前,编译器只会检查函数模板的声明部分,而不会检查函数模板的函数体部分;只有发生了该函数模板的函数调用时(函数模板实例化),编译器才会生成特定实例化的函数代码并且对实例化后的函数体进行语法检查等。

  也就是说,我们是不是可以这样理解:函数模板只是一个空壳,在未实例化前,编译器只能看到这个壳子的首部也就是函数模板的声明,在利用这个空壳生成了一个真正的“产品”也就是实例化后产生的实例函数才拥有了能够被编译器看到的函数体部分,进而被编译器进行函数声明和函数体部分的语法检查。

 

posted @   _程序兔  阅读(444)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示