深入学习C++关键字:auto与decltype

73 阅读1分钟
在之前的auto讨论中提到了它的推导规则和弊端。
所以,我们将autodecltype结合使用来达到理想的效果

示例:
//错误示范
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];
} 
/*
      这是模板推导。 
*/