在使用模板时可以显示指定模板类型,尤其是针对有返回类型的模板,显示指定可以避免类型转换带来的困扰。
但有时候显示指定模板实参类型会给用户增添额外负担,而且不会带来什么好处。
比如如下代码,接受表示序列的一对迭代器和返回序列中的一个元素的引用:
template<typename It>
??? &fcn(It beg,It end){
return *beg;
}
我们并不知道返回结果的准确类型,但知道所需类型是所处理的序列的元素类型。
vector<int> vi = {1,2,3,4,5};
auto &i =fcn(vi.begin,vi.end());
如上代码,知道函数应该返回 *beg,而且知道我们可以用 decltype(*beg) 来获取此表达式的类型。
但是,在编译器遇到函数的参数列表之前,beg 都是不存在的。为此,我们需要使用尾置返回类型。
[阅读全文]