C++11的auto与decltype

    auto关键字在C++98中用于标识一个临时变量,实际上由于极少使用而显得特别鸡肋,在C++11中auto则被赋予了新的含义,主要是用于自动类型推断。

    C++是一种强类型的编程语言,所谓的强类型语言简单来说就是对于变量的定义必须明确其类型,而相对一些脚本语言如PHP和JS等则可以根据语境自动推断变量类型,这在C++中是很难做到的,但是auto关键字的出现在一定程度上改变了这种情况。auto关键字能够使得编译器帮助我们分析表达式返回值所属类型,因为auto需要根据表达式的类型进行推断,所以其必须有初始值,auto的用法如下:

   auto vala = 10,valb = 15;

   auto item = vala + valb;

   以上示例中,编译器可以根据vala和valb的赋值确定其为整数类型,进而推断item为整数类型。auto语句允许在同一条语句中声明多个变量,但是这些变量类型必须一致,例如:

   auto i = 10,*ptr = &i;   //(正确)

   auto j = 10,s = 12.5f;  //(错误)

   上述两个声明中前者是可以接受的,因为两个变量的类型均为整数型,而后者则包含了一个整型一个浮点型,编译器无法正常推断。

    另外,编译器的推断结果和初值类型并非必然完全一致,例如:

    auto i = 10,&j = i;

    在上例中j实际上是引用类型,但是由于引用实际上使用的是引用的对象,所以编译器在实际推断的时候是以引用对象的类型作为参考的,所以j的推断类型实际为int型。还有一种情况是,auto会忽略顶层const而保留底层const。

    C++11引入的另一个类型说明符为decltype,decltype 根据表达式的返回类型做数据类型推断,编译器分析表达式并得到其类型但对表达式本身并不进行实际计算。和auto的主要不同在于如果表达式是一个变量,decltype返回的是该变量的类型,包括顶层的const和引用,而auto一般是忽略的,例子如下:

    const int  i = 0;&j = i;

     decltype(i) x = 10;   //x的类型被推断为i的类型,即const int 型。

     decltype(j) y = x;     //这里y被推断为j的类型,及const int&类型

     对于指针类型而言,如果使用了解引用符,则变量返回为引用,例如:

     int* p = &i;

     decltype(*p) q = &i;

      其中decltype(*p)被解析为int&类型。还有需要注意的一点是如果一个变量被多加了一层或多层括号,编译器会把变量当成表达式处理,其结果是返回一个引用类型,例如:

      decltype((i)) d = j; //这里decltype((i))将返回int& 类型而非int型。

       auto和decltype可以联合使用进行函数类型自动推导,例如:

       auto func(int i ,int b)->decltype(i+j){

            return i+j;

        }

      上述使用方法用auto做占位符,因为auto在这种情况下无法获取返回值类型,而 如果把decltype(i+j) 放在前面替换auto的话又违反了函数定义规则,即变量必须先声明后使用,所以此时auto作为占位符使用,而返回类型则通过decltype在形参定义后给出,这是。

       最后需要指出的是在C++14中auto的自动推导能力得到进一步扩展,因此你可以写出如下函数式:

       auto func(auto i,auto j)->decltype(i+j){

           return i+j;

       }

  

你可能感兴趣的:(C/C++)