广西建设厅微信网站,做那种网站赚钱,长沙市网站开发,公司起名字大全免费四字函数模板#xff08;二#xff09; ● 模板实参的类型推导 – 如果函数模板在实例化时没有显式指定模板实参#xff0c;那么系统会尝试进行推导
templatetypename T
void fun(T input, T input2)
{std::cout input \t input2 …函数模板二 ● 模板实参的类型推导 – 如果函数模板在实例化时没有显式指定模板实参那么系统会尝试进行推导
templatetypename T
void fun(T input, T input2)
{std::cout input \t input2 std::endl;
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);funint(3, 5.0); //OK, 5.0 static_cast to intfun(3, 5.0); //Error: 3 deducted to int but 5.0 deducted to doublereturn a.exec();
}– 推导是基于函数实参表达式确定模板实参的过程其基本原则与 auto 类型推导相似 ● 函数形参是左值引用 / 指针 – 忽略表达式类型中的引用 – 将表达式类型与函数形参模式匹配以确定模板实参 ● 函数形参是万能引用 – 如果实参表达式是右值那么模板形参被推导为去掉引用的基本类型 – 如果实参表达式是左值那么模板形参被推导为左值引用触发引用折叠 ● 函数形参不包含引用 – 忽略表达式类型中的引用 – 忽略顶层 const
templatetypename T
void fun(T input)
{std::cout input std::endl;
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x 3;int ref x;fun(ref); //T被推导为intconst int ref2 x;fun(ref2); //T被推导为intreturn a.exec();
}templatetypename T
void fun(T input)
{std::cout input std::endl;
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x 3;const int* const ptr x;fun(ptr);//T被推导为const int*忽略顶层constptr会不会被修改不会影响到input会不会被修改return a.exec();
}– 数组、函数转换成相应的指针类型 系统的转换是有限的不会考虑static_cast等等的转换。 参考 深蓝学院C基础与深度解析