This question already has an answer here:
What are template deduction guides and when should we use them?

(1个答案)


2年前关闭。




我在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推导doubleT2int(1.0, 2)

另请参阅:
  • Class template argument deduction(since C++17) - cppreference.com
  • deduction guides for std::pair - cppreference.com
  • c++ - What are template deduction guides and when should we use them? - Stack Overflow
  • cpp-docs/visual-cpp-language-conformance.md at master · MicrosoftDocs/cpp-docs · GitHub
  • 08-26 18:17