C++11新特性:decltype类型推导

文章介绍了C++11中新增的关键字auto和decltype的用途。auto用于编译时根据初始化表达式确定变量类型,但不能推导数组或结构体数据成员的类型。decltype则能从表达式中推导类型,不依赖于变量声明,可用于定义新变量。示例展示了decltype如何获取函数返回类型的类型。

      auto,用于通过一个表达式在编译时确定待定义的变量类型,auto 所修饰的变量必须被初始化,编译器需要通过初始化来确定 auto 所代表的类型,即必须要定义变量。若仅希望得到类型,而不需要(或不能)定义变量的时候应该怎么办呢?

//auto:  
//1 不能推数组的类型:
//2 不能结构体里面推数据成员的类型
struct Node
{
    auto val;                  //err
    int sum;
};



int main()
{
    auto ar[] = { 1,2,3,4,5 };  //err
    return 0;
}


       C++11新增了 decltype 关键字,用来在编译时推导出一个表达式的类型。

 decltype (exp)

       其中,exp表示一个表达式 (expression)
       从格式上来看,dectype 很像sizeof一用来推导表达式类型大小的操作符。类似于sizeof,decltype 的推导过程是在编译期完成的,并且不会真正计算表达式的值。

int main()
{
    cout << strlen("yhping") << endl; //    6     字符串长度为6 没有\0
    cout << sizeof("yhping") << endl; //    7     字符串占了7个字节 有\0 字符串的结束
    //decltype(x);

    return 0;
}


int main()
{
    auto x = 10;
    decltype(x) y;   //int y  把x类型抽出来定义y
    sizeof(x);       //计算x的大小
    return 0;
}

        decltype在技术和使用上和sizeof非常像,都需要编译器在编译期计算类型,但是sizeof返回的是整数,而decltype得到的是类型

decltype和auto的异同:

与auto不同点:

       decltype的类型推导并不是像auto一样是从变量声明的初始化表达式获得变量的类型,decltype总是以一个普通的表达式为参数,返回该表达式的类型。

与auto相同点:

①、作为一个类型指示符,decltype可以将获得的类型来定义另外一个变量;

②、decltype类型推导也是在编译时进行的

auto varname = value;
decltype(exp) varname = value;

其中,varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式。 

示例如下:

 

 

 

 

 

 

 

template<class T>
T Add(T a, T b)
{
    return a + b;
}

int main()
{
    decltype(Add(12, 23)) x;
    return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值