建構函式的模板引數推導

在 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>