Use function templates to deduce class template argument types (where feasible)
Reason
Writing the template argument types explicitly can be tedious and unnecessarily verbose.
Example
tuple<int, string, double> t1 = {1, "Hamlet", 3.14}; // explicit type
auto t2 = make_tuple(1, "Ophelia"s, 3.14); // better; deduced type
Note the use of the s suffix to ensure that the string is a std::string, rather than a C-style string.
Note
Since you can trivially write a make_T function, so could the compiler. Thus, make_T functions might become redundant in the future.
Exception
Sometimes there isn't a good way of getting the template arguments deduced and sometimes, you want to specify the arguments explicitly:
vector<double> v = { 1, 2, 3, 7.9, 15.99 };
list<Record*> lst;
Note
Note that C++17 will make this rule redundant by allowing the template arguments to be deduced directly from constructor arguments: Template parameter deduction for constructors (Rev. 3). For example:
tuple t1 = {1, "Hamlet"s, 3.14}; // deduced: tuple<int, string, double>
Enforcement
Flag uses where an explicitly specialized type exactly matches the types of the arguments used.