zoukankan      html  css  js  c++  java
  • C++ auto 关键字

    在C++ 98 中,auto 的作用是让变量成为自动变量(拥有自动的生命周期),但是该作用是多余的,变量默认拥有自动的生命周期,在C++ 11 中,已经删除了该用法,取而代之的作用是:自动推断变量的类型。

    举例:

      int32_t a = 1;

      auto b = a;

      std::cout <<typeid(b).name() << std::end; // 输出结果:int  typeid运算符可以输出变量的类型

    auto 在实际编程中的用法

      对于上面的情形,在实际编程中不推荐,因为不便于他人阅读,直接写出变量的类型会更加的清晰易懂,主要用于代替冗长复杂,变量使用范围专一的变量声明,比如:

      std::vector<std::string> vec;

      for (auto iter = vec.begin(); iter != vec.end(); ++iter) {}

      在定义函数模板时,用于声明依赖模板参数的变量类型

      模板函数依赖于模板参数的返回值,比如:

      template<typename Tx, typename Ty>

      auto multiply(Tx x, Ty y)

      {

        return x * y;

      }

    注意事项:

    (1)auto 变量必须在定义时进行初始化操作(这很好理解,如果不进行初始化操作,那么 auto 关键字就不能进行变量类型的推导了)

    (2)定义一个 auto 序列的变量时,必须是同一种类型,如:

      auto a = 1, b = 2, c = 3; // 正确

      auto a = 1, b = 2.2, c = 'c'; // 错误(这个道理和第一点注意事项相同)

    (3)如果表达式是引用,则去除引用语义

      int32_t a = 1;

      int32_t& b = a;

      auto c = b; // 此时c的类型被推导为 int32_t,而不是int32_t&

      auto& c = b; // 此时c的类型才是int32_t&(自我理解,定义一个引用,那么就直接操作的是b,而b的类型是int32_t&,所以这里的类型是int32_t&)

    (4)如果表达式是const或volatile(或两者都有),则去除const/volatile语义

    (5)如果auto关键字带上&号,则不去除const语义

    (6)如果表达式为数组,auto关键字推导类型为指针,如:

      int32_t a[3] = {};

      auto arr = a;

      std::cout << typeid(arr).name() << std::end; // 这里输出 int *

    (7)如果表达式为数组,且auto带上&,则推导出的类型为数组类型,如:

      int32_t a[3] = {};

      auto& arr = a;

      std::cout <<typeid(arr).name() std::endl; // 这里输出int [3]

    (8)函数或模板参数不能被声明为auto

    (9)auto不是一个真正的类型,仅仅是一个占位符,不能使用一些以类型为操作数的操作符,如sizeof或typeid

      std::cout << sizeof(auto) std::endl; // 错误

      std::cout << typeid(auto).name() std::endl; // 错误

  • 相关阅读:
    SoundTouch
    80211
    netsh wlan
    jest--cmd
    必须精通nuxt了,不可变,to thi
    bili实际的ssr
    vscode 调试vuetify
    【Java】 第四章 异常处理 Notes learn Ma
    Windows 下的符号链接 小示例
    Java 第一二章 配置基础 与 java 数据类型
  • 原文地址:https://www.cnblogs.com/chen-cai/p/10066721.html
Copyright © 2011-2022 走看看