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&
  • 相关阅读:
    kafka关于修改副本数和分区的数的案例实战(也可用作leader节点均衡案例)
    kafka集群监控之kafka-manager部署(kafka-manager的进程为:ProdServerStart)
    flume配置kafka channle的实战案例
    HTML&CSS基础-表格简介
    HTML&CSS基础-雪碧图的制作和使用
    Hadoop生态圈-使用Ganglia监控flume中间件
    JavaScript基础知识-条件运算符(三元运算符)
    初识Apache Kafka 核心概念
    Hadoop生态圈-CentOs7.5单机部署ClickHouse
    安装Cloudera manager agent步骤详解
  • 原文地址:https://www.cnblogs.com/Smarc/p/13560801.html
Copyright © 2011-2022 走看看