模板参数推导和非推导上下文
在 C 中,模板参数推导允许编译器根据类型确定模板参数的类型传递给模板函数或类的参数。但是,在涉及非推导上下文的某些场景中,此机制可能会失败。
考虑以下代码片段:
template <class T> struct S { typedef T& type; }; template <class A> A temp(S<A>::type a1) { return a1; } template <class A, class B> B temp2(S<A>::type a1, B a2) { return a1 + a2; }
这里,S 结构体用作获取对该类型的引用的一种方式由模板参数 A 保存。但是,当尝试使用整数值调用这些函数时,如下所示,编译器报告错误:
int main() { char c = 6; int d = 7; int res = temp(c); int res2 = temp2(d, 7); }
错误消息:
解释:
出现此问题是因为 A 的类型仅在非推导上下文中使用,这意味着编译器无法从参数推断出它传递给函数。特别是, S::type 被认为是非推导的,因为它出现在嵌套模板类型中,并且与 temp 或 temp2 的参数没有直接关系。
解决方案:
要解决此问题并启用模板参数推导,必须在调用函数时显式指定 A 的类型,如下所示下面:
temp<char>(c);
这个显式规范允许编译器确定 A 的类型并成功实例化模板函数。
以上是为什么模板参数推导在非推导上下文中失败?的详细内容。更多信息请关注PHP中文网其他相关文章!