考虑以下简单代码:
template<typename U>
U foo(U a, U b){
//we don't really care about the body
return a + b;
}
和实例化:
int a = foo(1, 2);
据我所知,编译时,foo是专用的,编译器会生成:
int foo(int a, int b){
//we don't really care about the body
return a + b;
}
编译器生成此专用代码的顺序是什么?
例如,我知道如果你没有&#39; +&#39;运算符,然后代码将不会编译,因此执行一些成员函数表检查,并在某个时刻生成函数签名。
是否有要评估的返回类型,参数,操作等的特殊顺序?
答案 0 :(得分:1)
这不是专业化,这是实例化。
模板分两次管理。
第一个几乎是句法的;编译器只是验证代码是否正确。
然后当你使用给定或推断类型的模板(instanciate it)时,它会尝试生成代码(如果尚未完成),所以当它遇到a+b
时,它只是试图找到合适的运算符对于涉及的类型。如果未找到,则会发出错误,否则会发出代码(最终可能会发生其他一些错误)。