zoukankan      html  css  js  c++  java
  • Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype

    条款2、理解auto型别推导

    对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的。只有一种特例情况。

    我们先针对auto和模板型别推导一致的情况进行讨论:

    //某变量采用auto来声明的时候,其中auto就扮演了模板中的T这个角色,而变量的型别修饰词则对应函数形参param
    auto x = 27;//其中T对应auto、param也对应auto
    const auto cx = x;//T对应auto,param对应const auto
    const auto& rx = x; //param对应const auto&

    而对于auto与模板的区别主要在于大括号的使用上:

    //对于auto而言
    auto x{27};
    auto x = {27};
    //这两种方式都是声明了类型为std::initializer_list<int> 含有单个值为27的元素。
    auto x = {0.1,1,2}//大括号里面的类型不一样,无法推导,所以这种声明方式会报错。
    //对于模板而言
    template<typename T>
    void f(T param)
    f({11,23,9})//报错,就算类型一致,模板型推导也不会推导成std::initializer_list<int>这个点为两者的区别所在

    除此之外,对于函数的返回值,和lambda表达式的形参,在c++14中auto可以充当关键字,但是要注意的是此时的auto使用的推导方式是模板方式。也就是说返回值不能用大括号括起来。

    条款3、理解decltype


    1、其实对于decltype,没什么需要多说的。他就像当与一只鹦鹉。你给他什么,他就说什么。当然虽然有时候他的话也会让你大吃一惊。不过那也只是特例。

    主要需要新学习的是c++11中的返回值型别尾序语法,可能您见过,或者很熟悉。

    例如:

    template<typename Container, typename Index>
    auto authAndAccess(Container& c, Index i) ->decltype(c[i])
    {
        authenticateUser();
      return c[i]; }

    该函数的返回值类型在最后,这样做的好处是在指定返回值类型的时候可以用到函数形参。

    在c++14中这种用法可以用auto来替代但是因为auto的推导型别和模板类似在条款1中有说明,会忽略形参引用。

    但是c++中 使用decltype(auto) 来代替auto作为函数返回值,完美的解决了这个问题。

    2、对于参数是表达式的情况下,decltype的返回值总会是引用类型。比如:

    int x;
    decltype((x))//返回值结果为int&
  • 相关阅读:
    内存中的堆和栈
    数据库——关系型数据库
    如何创建一个进程,如何进程调用进程
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
    Moon.Orm 5.0(MQL版)使用指南
    初学 快速幂 的理解
    2016 杭电
    2015 偶数求和 AC 杭电
    2014 青年歌手大赛 AC
    C语言初学 数组 打印菱形
  • 原文地址:https://www.cnblogs.com/Smarc/p/13560801.html
Copyright © 2011-2022 走看看