我在Visual Studio c ++ 2017中尝试了此方法,
auto a = pair(1.0, 2);
我认为应该是
auto a = pair<double, int>(1.0, 2);
为什么这里不需要模板?
答案 0 :(得分:1)
它是C ++ 17的新功能,称为class template argument deduction。简而言之,此功能允许您在声明类模板实例的对象时省略类模板的模板参数,并让编译器推论这些参数。
std::pair
has a deduction guide in the standard library如下:
template<class T1, class T2>
pair(T1, T2) -> pair<T1, T2>;
表达式pair(1.0, 2)
是一个函数样式的强制转换表达式,没有显式模板参数列表,这是类模板参数推导的几种触发之一。
当触发类模板参数推论时,编译器将查找编译器生成的和用户编写的推论指南,并发现上述推论指南。该推论指南告诉编译器根据构造函数参数T1
推论double
为T2
和int
为(1.0, 2)
。
另请参阅: