αλεχολυτ Asked:2020-03-07 19:20:19 +0000 UTC2020-03-07 19:20:19 +0000 UTC 2020-03-07 19:20:19 +0000 UTC c++17 中的新模板类型推断规则 772 c++17 中新的模板类型推断规则是什么? c++ 1 个回答 Voted Best Answer αλεχολυτ 2020-03-07T19:20:19Z2020-03-07T19:20:19Z C++17 引入了在声明模板类型变量时省略显式提及模板参数类型的功能。例如,对于S其构造函数采用依赖于的参数的泛型类型T: template <class T> struct S { S(const T&) {} }; 您可以使用简化的符号,例如: S si(42); S sl(42l); S sd(42.); 乍一看,似乎所有变量si, sl,sd都具有相同的类型。如果它S不是模板类型,它确实会是这样。但是在这种情况下,变量的实际类型是不同的,并且是从传递给构造函数的参数类型派生的。以前的语言标准的等效符号如下所示: S<int> si(42); S<long> sl(42l); S<double> sd(42.); 确实,当在三角括号中明确指定类型时,在参数中使用不同类型没有多大意义,即 你可以在任何地方使用整数42。 上面提到的编译器逻辑依赖于隐式类型推导(Implicit Deduction Guides)。但除此之外,还有一个显式的(Explicit Deduction Guides)。在这种情况下,您可以告诉编译器在尝试推断类型时显式使用某些目标类型。例如,如果您在类模板定义之后添加以下行: S(double) -> S<int>; 这将导致编译器在构造函数参数为 type 时int选择类型。那些。在这种情况下,条目如下:Tdouble S sd(42.); 已经创建了一个 类型的变量S<int>,而不是S<double>. S<double>仍然可以创建类型对象,但必须显式指定类型。 有关类型推断规则的更多信息,请参阅标准草案: [temp.deduct.guide] [over.match.class.deduct]
C++17 引入了在声明模板类型变量时省略显式提及模板参数类型的功能。例如,对于
S其构造函数采用依赖于的参数的泛型类型T:您可以使用简化的符号,例如:
乍一看,似乎所有变量
si,sl,sd都具有相同的类型。如果它S不是模板类型,它确实会是这样。但是在这种情况下,变量的实际类型是不同的,并且是从传递给构造函数的参数类型派生的。以前的语言标准的等效符号如下所示:确实,当在三角括号中明确指定类型时,在参数中使用不同类型没有多大意义,即 你可以在任何地方使用整数
42。上面提到的编译器逻辑依赖于隐式类型推导(Implicit Deduction Guides)。但除此之外,还有一个显式的(Explicit Deduction Guides)。在这种情况下,您可以告诉编译器在尝试推断类型时显式使用某些目标类型。例如,如果您在类模板定义之后添加以下行:
这将导致编译器在构造函数参数为 type 时
int选择类型。那些。在这种情况下,条目如下:Tdouble已经创建了一个 类型的变量
S<int>,而不是S<double>.S<double>仍然可以创建类型对象,但必须显式指定类型。有关类型推断规则的更多信息,请参阅标准草案: