在之前的auto讨论中提到了它的推导规则和弊端。
所以,我们将auto与decltype结合使用来达到理想的效果
示例:
//错误示范
template<typename Container, typename Index>
auto authAndAccess(Container& c, Index i) {
authenticateUser();
return c[i];
}
/*
c是一个容器的引用,它将返回c中的一个元素。
而且我们希望c[i]是什么类型就返回什么类型。
但,如果c[i]是一个引用类型。
auto推导出来的类型肯定跟c[i]不一样(auto推导的第一步就是去引用)
你可能会说,这样的话我用auto&不就行了吗?这样的问题是,如果
c[i]是一个bool类型的话就又出错了。因为bool没有引用。
*/
//正确示范
template<typename Container, typename Index>
auto authAndAccess(Container& c, Index i) ->decltype(c[i]) {
authenticateUser();
return c[i];
}
/*
->decltype(c[i])称为尾随返回类型技术。
它的作用就是让编译器从函数的实现来推导这个函数的返回类型。
这其实已经不是auto的模板推导了。
*/
//正确示范
template<typename Container, typename Index>
decltype(auto) authAndAccess(Container& c, Index i) {
authenticateUser();
return c[i];
}
/*
这是模板推导。
*/