c++11 decltype

c++11 decltype

decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型。decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题。decltype无法在派生类声明和析构函数调用中使用。
类似于sizeof操作符,decltype也不需对其操作数求值。粗略来说,decltype(e)返回类型前,进行了如下推导: 

若表达式e指向一个局部变量、命名空间作用域变量、静态成员变量或函数参数,那么 返回类型即为该变量(或参数)的“声明类型”; 
若e是一个左值(lvalue,即“可寻址值”),则decltype(e)将返回T&,其中T为e的类型;
若e是一个x值(xvalue),则返回值为T&&; 
若e是一个纯右值(prvalue),则返回值为T。

 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>


void mytest()
{
    int i;
    decltype(i)j = 0;
    std::cout << typeid(j).name() << std::endl; // j ---> int

    float a;
    double b;
    decltype(a+b) c;
    std::cout << typeid(c).name() << std::endl; // c ---> double

    std::vector<int> vec;
    typedef decltype(vec.begin()) vectype;
    vectype k;
    std::cout << typeid(k).name() << std::endl;
    for (k = vec.begin(); k < vec.end(); k++)
    {
        // do some thing ...
    }

    enum // 匿名枚举变量
    {
        OK, Error, Warning 
    } flag;
    decltype(flag) tmp = OK;
    std::cout << typeid(tmp).name() << std::endl;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值