gpt4 book ai didi

c++ - 模板特化和引用

转载 作者:行者123 更新时间:2023-12-03 06:49:45 25 4
gpt4 key购买 nike

Functional programming in C++ ,第 11 章涉及一些基本的模板元编程。
在这种情况下,作者展示了 remove_reference 的这个实现。/remove_reference_t , 与 cppreference 中描述的基本相同.

template<typename T> struct remove_reference      { using type = T; };
template<typename T> struct remove_reference<T&> { using type = T; };
template<typename T> struct remove_reference<T&&> { using type = T; };
template<typename T> using remove_reference_t = typename remove_reference<T>::type;
引用上面的代码,作者评论说“调用”时 remove_reference_t<int> ,只有通用(或初级?这里的更正词是什么?)模板成功替代 T ,其他两个失败。这对我来说很清楚,没有办法 int可以写成/匹配 T&T&& .
关于 remove_reference_t<int&> ,然而,作者说第二个专业不能匹配。好吧,由于引用折叠,它不能匹配吗?我的意思是,不能 T&&匹配 int&如果我替换 Tint& ,从而得到 int&&& == int& ?
同样,当调用 remove_reference_t<int&&> 时,不能第一专精的 T&匹配 int&&如果 T代替 int& ? (为什么我认为 & & 会崩溃到 && 而不是 & ?)
是什么让编译器放弃一种特化?

最佳答案

only the general (or primary? What is the correcto word here?) template


C++ 标准使用的技术术语是“主类模板”。与它的部分特化和显式特化相比,它也将是最通用的类​​模板。考虑到足够的上下文,这也可能是合理的称呼。
“引用折叠规则”可在 [dcl.ref]/6 中找到主要适用于确定将引用类型别名为 & 的特定类型名称的组合含义时。或 && token 通常会形成对类型名称类型的引用。为 T& 形式的模板参数推导出模板参数或 T&&正好相反。虽然将模板参数推导视为“找到模板参数,使结果类型匹配”是有帮助的,但模板参数推导的技术细节要具体得多; [temp.deduct]是几页关于这种扣除具体如何进行的规则,其他部分还有其他相关规则。需要详细信息,以便编译器在可能有多个“正确”答案的情况下达成一致,并且编译器不需要处理一些更困难的情况。
特别是在匹配依赖类型时 P已知类型 A , 通过 [temp.deduct.type]/8 中的可推导类型列表, 如果同时 P 都可以扣除和 A有表格 T&或者如果两者都有 T&& 的形式.尝试对偏特化进行参数推导时 remove_reference<T&&>确定 remove_reference<int&>的定义, PT&&Aint& ,所以他们不共享这些形式之一。
模板参数推导规则没有从引用折叠规则的反向推导参数的一般允许。但他们确实有有限的津贴,这与某些情况有关:每 [temp.deduct.call]/3 , 如果 T是模板类型参数,但 不是类模板的参数 ,然后输入 T&&是转发引用。比较参数推导的类型时,如果 P=T&&是转发引用类型和 A是左值引用类型,那么模板类型参数 T可以推导出左值引用类型 A , 仅当 A是左值函数参数表达式的类型(又是 [temp.deduct.call]/3)或者有时是 PA被比较是因为它们代表两个比较函数类型 ( [temp.deduct.type]/10 ) 中的函数参数类型。

Similarly, when ["]calling["] remove_reference_t<int&&>, can't the first specialization's T& match int&& if T is substituted for T&?


在这种情况下,不可能实现偏特化 remove_reference<T&>可以匹配 remove_reference<int&&> .即使模板参数推导过程允许为这种情况找到潜在的答案,也不存在可能的类型 T使得 T&int&& 相同.

关于c++ - 模板特化和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63801580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com