我很难理解在以下情况下演绎是如何工作的:
template<class Category, Category code>
struct AImpl
{ };
template<class Category, Category code>
struct AHelper
{
using type = AImpl<Category, code>;
};
template<class Category, Category code>
using A = typename AHelper<Category, code>::type;
template<int code>
void doSomething(A<int, code> object)
{
}
以下是测试代码:
A<int, 5> a1;
doSomething(a1); // This does not compile
doSomething<5>(a1); // This compiles
为什么 a1 没有在这种情况下推导出来?
如果您按以下方式修改 A:
template<class Category, Category code>
struct A
{ };
两者都有效。有人知道为什么吗?
[编辑]
问题链接到混合别名和模板专业化 https://stackoverflow.com/questions/55969287/mixing-aliases-and-template-specializations
为什么 a1 没有在这种情况下推导出来?
因为模板参数doSomething
出现在非推导的上下文中。别名模板几乎完全代表它的别名。你的定义如下:
template<class Category, Category code>
using A = typename AHelper<Category, code>::type;
推论code
,编译器需要推导出左侧的一些内容::
这是一个非推导的上下文。如果某个参数出现在作用域解析运算符左侧,模板参数推导甚至不会尝试推导它。
这是一个未推断的上下文并非没有原因。请记住,模板可能是专门的。我可以添加这个:
template<Category code>
struct AHelper<int, code>
{
using type = BImpl<code>; // My own class!
};
编译器需要查看整个程序中的所有代码并尝试所有类型以确保没有发生任何恶意行为,以确保a1
确实匹配typename AHelper<Category, code>::type
。这很棘手。因此,元功能的映射只是一条单行道。您不能要求编译器从目标类型推断出源类型(或非类型参数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)