template<typename T>
void f1(T t);
template<typename T>
void f2(const T t);
template<typename T>
void f3(T& t);
template<typename T>
void f4(const T& t);
template<typename T>
void f5(T&& t); //universal reference
template<typename T>
void f6(const T&& t);
这六种功能模板的区别是什么?
模板参数演绎与统一(一般PLT概念)之间的关系是什么?
=== 评价:
我知道从http://en.cppreference.com/w/cpp/language/template_argument_deduction获取一些细节。但是这个网站仍然很困惑。也许更清晰的描述对于处理模板参数推导的过程是有帮助的。
答案 0 :(得分:0)
对于您的PLT相关问题,恕我直言,统一推断出函数定义时的类型。参数类型是从函数本身如何使用参数推断出来的。
模板参数函数在使用时被实例化。参数类型从函数 caller 传递。然后编译器检查参数类型是否符合函数体中参数的使用方式。这听起来像是动态类型&#39;,它可能允许更正确的代码,但可能会拒绝更少的错误代码。
以下C ++ 14代码有效。 auto参数类型在内部用模板实现。
([] (auto f, auto b) {
return b ? f(string("str")) : MyIntToString(f(MyInt(422)));
})([] (auto x) { return x; }, true)
通过简单统一,以下Haskell风格的代码不会通过类型检查。
(\f b -> if b
then f 1
else StringToNumber(f "123")) (\x -> x) True
&#39; F&#39;预计将是&lt;&gt; t1&#39;和&#39; String-&gt; t2&#39;,它们没有统一。
欣德利 - 米尔纳也不会有任何帮助,因为它概括了“让...”。但这里只是一个lambda论点。