c++ type deduction