zoukankan      html  css  js  c++  java
  • 初探c++11之类型推断

    编程语言可以分为两类,一类是强类型语言,例如C/C++,任何变量都要明确指出其变量类型,另外一类则是弱类型语言,所有变量都不需要明确是定类型,这一类主要是各种脚本语言,javascript, python, php, etc.

    C++11中引入了一个新特性,可以在两种情况下不明确指定变量类型,而由编译器推断出变量类型。第一种情况是由初始化变量的类型来推断变量类型,如下,例子来自wiki

    auto otherVariable = 5;
    auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);

    在这种情况下,变量的类型写成"auto"就可以,而编译器会推断它的类型。上例中第一种情况变量类型推断为整数,而第二种情况则按照boost::bind()这个函数的返回值来推断变量类型。

    第二种情况是根据之前定义的变量的类型来推断当前定义变量的类型,如下,来自wiki

    int someInt;
    decltype(someInt) otherIntegerVariable = 5;

    在这种情况下,变量类型写成decltype(refference variable),编译器以reference variable的类型来推断当前变量的类型。

    auto类型可以帮助我们在很多情况下简化代码,例如std::vector<int>::iterator itr=container.begin() 可以简化成auto itr=container.begin()  (太爽了!),例如那些模板神马的。其次还可以简化思维,很多时候我们需要去查看一个函数的返回值来写变量声明,现在,直接auto就好了……

    不过,这里还存留一些疑问。在wiki上有如下的一个例子,看的有些迷糊。

    #include <vector>
     
    int main()
    {
      const std::vector<int> v(1);
      auto a = v[0];// a 為 int 型別
      decltype(v[0])b;   // b 為 const int& 型別,即
                          // std::vector<int>::operator[](size_type)const 的回返型別
      auto c = 0;         // c 為 int 型別
      auto d = c;         // d 為 int 型別      
      decltype(c) e;      // e 為 int 型別,c 實體的型別 
      decltype((c)) f = e; // f 為 int& 型別,因為(c)是左值
      decltype(0) g;      // g為int型別,因為0是右值
    }

    查看了c++ FAQ的说明,依然不能明白。这里先存疑吧。不过里面有这样一句话,“当你只有需要推断某个表达式的数据类型,例如某个函数调用表达式的计算结果的数据类型,而不是某个变量的数据类型时,你才真正需要delctype。

  • 相关阅读:
    教程:在 Visual Studio 中开始使用 Flask Web 框架
    教程:Visual Studio 中的 Django Web 框架入门
    vs2017下发现解决python运行出现‘No module named "XXX""的解决办法
    《sqlite权威指南》读书笔记 (一)
    SQL Server手工插入标识列
    hdu 3729 I'm Telling the Truth 二分图匹配
    HDU 3065 AC自动机 裸题
    hdu 3720 Arranging Your Team 枚举
    virtualbox 虚拟3台虚拟机搭建hadoop集群
    sqlserver 数据行统计,秒查语句
  • 原文地址:https://www.cnblogs.com/l00l/p/2486021.html
Copyright © 2011-2022 走看看