构造函数的模板参数推导

在 C++ 17 之前,模板推导不能在构造函数中推导出类的类型。必须明确指定。然而,有时这些类型可能非常麻烦或(在 lambdas 的情况下)不可能命名,因此我们得到了大量的类型工厂(如 make_pair()make_tuple()back_inserter() 等)。

Version >= C++ 17

这不再是必要的:

std::pair p(2, 4.5);     // std::pair<int, double>
std::tuple t(4, 3, 2.5); // std::tuple<int, int, double>
std::copy_n(vi1.begin(), 3,
    std::back_insert_iterator(vi2)); // constructs a back_insert_iterator<std::vector<int>>
std::lock_guard lk(mtx); // std::lock_guard<decltype(mtx)>

构造函数被认为是推导出类模板参数,但在某些情况下这是不够的,我们可以提供明确的演绎指南:

template <class Iter>
vector(Iter, Iter) -> vector<typename iterator_traits<Iter>::value_type>

int array[] = {1, 2, 3};
std::vector v(std::begin(array), std::end(array)); // deduces std::vector<int>