函数名称解析取决于模板参数
Function name resolution depending on template parameter
在测试中遇到以下任务:
#include <iostream> using namespace std;
template<typename T> void adl(T) { cout << "T"; }
struct S { };
template<typename T> void call_adl(T t) { adl(S()); adl(t); }
void adl(S) { cout << "S"; }
int main () { call_adl(S()); }
问题是将调用哪些函数。还有一种解释是,不依赖于模板参数的函数的名称在模板定义时解析,而依赖于模板变量的函数的名字在已知模板变量时解析。那么,这些"时代"之间有什么区别?
好问题。它将首先调用模板版本,然后调用非模板版本。【实例】
正如解释所说,原因是在这个表达式中:
adl(S());
解析程序一遇到名称adl
就解析它。请注意,此时adl(S)
函数尚未声明。因此,名称必须解析为函数模板。
另一个表达式:
adl(t);
不同,因为它取决于模板参数T
(它是t
的类型)。因此,名称的解析被推迟到实例化时间,此时T
的参数是已知的。实例化发生在main
中,在声明adl(S)
之后。因此,此调用解析为非模板版本。
相关文章:
- 将强制转换简化为取决于参数的类型
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 模板函数,其中模板参数类型取决于函数参数
- GCC:指定的界限取决于源参数的长度
- 具有尾随返回类型的通用 lambda,具体取决于 C++11 中的可变参数
- 类模板中的std ::数组的大小,具体取决于模板参数
- LIBELAS是否取决于相机参数
- 具有取决于模板参数的方法的模板类
- 模板层次结构中的可选虚拟函数,具体取决于参数
- 约束模板参数取决于传递的函子
- 为什么固定尺寸错误发生取决于默认参数
- C++14 lambda 的默认参数类型推导,具体取决于前面的参数
- 委托构造函数和默认参数,具体取决于其他参数
- 取决于参数的数量,将其返回结构对象,并将其分配给常规结构的对象
- 具有模板参数取决于参数列表
- 返回类型取决于模板参数
- 是否可以定义一个 C++11 可变参数类模板,其可变参数基数取决于整数模板参数
- 返回取决于sizeof的变量类型..参数包
- 模板化结构的友元函数,其参数类型取决于结构的内部
- 变量模板函数,其中返回类型取决于模板参数列表