这个问题在这里已有答案:
我在Visual Studio c ++ 2017中尝试这个,它可以工作
auto a = pair(1.0, 2);
我认为应该是
auto a = pair<double, int>(1.0, 2);
为什么这里不需要模板?
这是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)
。
另见: