c++11 decltype

auto修饰的变量必须被初始化,编译器需要通过初始化来确定auto所代表的类型,而decltype修饰的变量不需要初始化,用来在编译时推导出一个表达式的类型。decltype推导的结果保留表达式的所有属性(cv(const和volatile限定符的统称)、引用)

auto推导左值表达式时,会带引用,推导右值表达式时,不带引用。

struct Foo
{
    int x;
};

const Foo foo = Foo();

decltype(foo.x) a = 0;        //a->int
decltype((foo.x)) b = a;    //b->const int&

int n = 0;
int m = 0;
decltype(n + m) c = 0;        //c->int
decltype(n += m) d = c;        //d->int&

decltype经常用在泛型编程中,结合auto,返回值类型后置

template<typename T, typename U>
auto add(T t, U u)->decltype(t + u)
{
    return t + u;
}

通过返回类型推导,很容易将foo函数的返回类型用在func函数上

int foo(int& f);
float foo(float& f);

template<typename T>
auto func(T& t)->decltype(foo(t))
{
    return foo(t);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值