模板参数推导和统一

时间:2014-12-31 09:17:45

标签: c++ templates programming-languages

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获取一些细节。但是这个网站仍然很困惑。也许更清晰的描述对于处理模板参数推导的过程是有帮助的。

1 个答案:

答案 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论点。