部分模板专业化和演绎指南

  • 本文关键字:演绎 专业化 c++
  • 更新时间 :
  • 英文 :


我有一个问题,关于何时需要指定推导指南,特别是为什么在下面的基模板中显式定义构造函数会删除对它的要求。IOW,要么需要定义基模板中的构造函数,要么需要推导指南来编译下面的代码段。我猜这与需要构造函数的基本模板参数的推导有关,但如果能在这里澄清一下,我将不胜感激。

#include <utility>
template <typename ...T>
struct Type {
// Needs to be uncommented if deduction guide is not specified
// Type(T&&...) { }

};
template <typename T, typename ...Ts>
struct Type<T, Ts...> : Type<Ts...> {
Type(T&& x, Ts&&... y) : Type<Ts...>(std::forward<Ts>(y)...) {
}
};
//template <typename ...T>
//Type(T&&...) -> Type<T...>;
int main() { 
Type t{1,2.3,false};
}

类模板参数推导使用一组由模板定义合成的隐式指南,加上为类模板声明的任何显式推导指南

Type的部分专业化不参与隐式引导的生成。如果你的程序中有明确的(完全的(专业化,也不会。

如果没有声明显式推导指南,则必须在类模板中具有适当的构造函数,才能隐式生成类似的指南1

1也有一些例外;即使在没有构造函数的情况下,某些指南也是隐式生成的。我不会在这里谈这个。

最新更新