c++11: decltype与后置类型的作用(有example版)

提示:内含案例,网络上很多文章都没有

目录

前言

一、decltype是什么?

二、返回值类型后置

1.什么是返回值类型后置

2.运行结果

总结


前言

c++11之中有许多新特性,虽然大部分都有所了解,但是还是有些特性,在实际工作之中没有用过,今天这个是返回类型后置


 

一、decltype是什么?

decltype功能和auto是类似的。都是用于类型推导。但是他们之间有如下区别:

auto varname = value;
decltype(expression) varname = value;
1. auto 根据=右边的初始值 value 推导出变量的类型,而 decltype 根据 expression 表达式推导出变量的类型,跟=右边的 value 没有关系, expression 推导出的类型不能是 void,即表达式expression返回值类型不能是void。
2. auto 要求变量必须初始化,而 decltype 不要求。

decltype一般喜欢用于返回值类型后置。

二、返回值类型后置

1.什么是返回值类型后置

返回值类型后置语法,是为了解决函数返回值类型依赖于参数,无法用标准类型表示,而导致难以确定返回值类型的问题。简单说就是有一些函数他们的返回值类型多样,无法确定。那让我们想想什么函数会有这样的效果?没错,就是模版函数!

代码如下(示例):

#include <iostream>
#include <type_traits>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

struct A { double x; };
const A* a;

decltype(a->x) y;       // y的返回值类型是double
decltype((a->x)) z = y; // z的返回值类型是const double&

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) // 返回值类型取决于模版参数,重点以返回类型取决于模版参数来举例讲解                                    
{
    return t + u;
}

int main(){
  int a = 1;float b = 2.3;int c = 3;
  // a与b相加,根据数据类型自动转换原则,结果应该是一个float类型
  cout << abi::__cxa_demangle(typeid(add(a,b)).name(), 0, 0, 0)  << endl;
  // a与c相加,数据类型应该是int类型
  cout << abi::__cxa_demangle(typeid(add(a,c)).name(), 0, 0, 0) << endl;

  return 0;
}
// g++ test17.cpp -o test17 -std=c++11

2.运行结果

运行结果如下 :

[root@VM-123-169-centos c++]# ./test17                           
float
int


 

总结

新特性的产生都是因为实际之中有不方便解决的问题之后才会有人发明出来的。decltype就是一个这样一个特性,为了解决函数返回值类型多样,无法确定。有时候记住一个为什么,远比答案本身有意义。


版权声明:本文为ganweiba原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。