建構函式的模板引數推導
在 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>