美文网首页
decltype和返回类型后置

decltype和返回类型后置

作者: 艰默 | 来源:发表于2023-02-06 15:54 被阅读0次

文章首发公众号:iDoitnow

1. decltype

decltype的使用方式如下:

decltype(expression) var;

关键字decltype的作用是将变量的类型声明为表达式指定的类型。即将var的类型声明为expression指定的类型。编译器在处理decltype的时候,实际上需要对expression进行一个核对,然后才能确定var的类型。其流程和核对规则大致如下:

  • 1)如果expression是一个没有用括号括起来的标识符,则var的类型与该标识符的类型相同。例如:

    double x = 1.0;
    double y = 2.0;
    double &lx = x; 
    const double *pd;
    
    decltype(x) m;      //m的类型为double
    decltype(lx) n = y; //n的类型为double &
    decltype(pd) u;     //u的类型为const double *
    
  • 2):如果expression的条件不符合1),而expression是一个函数的调用,则var的类型与函数的返回值类型相同。例如:

    int sum(int a, int b){...}
    
    decltype(sum(1,2)) m; //m的类型为int
    
  • 3):如果expression的条件不满足1)、2),而expression是一个左值,则var指向该左值类型的引用。例如:

    double xx = 1.0;
    
    decltype( (xx) ) rx = xx; //rx的类型是double &
    decltype(xx) m = xx; //m的类型是double,因为虽然xx是左值,但该类型的确定在步骤1)就已经确认了,所以走不到步骤3)
    

    :括号并不能改变表达式的值和左值性。】

  • 4)如果expression的条件不满足1)、2)、3),则expression的类型就是var的类型。例如:

    int a = 1;
    int &b = a;
    int &c = a;
    
    decltype(a+1) a1; //a1的类型为int
    decltype(100L) aa;//aa的类型为long
    decltype(b+c) bc; //bc的类型为int,虽然b和c都是引用,但b+c不是引用,而是两个int的和,因此bc的类型也为int
    

2. 返回类型后置

C++11新增加了一种函数声明的语法:在函数名和参数后面指定返回类型。该语法与auto搭配使用,其使用形式如下所示:

auto fun(int a, int b) -> int

该语法主要是为了解决某些模板函数返回值类型问题,例如下面这个模板函数:

template<typename T, typename U>
??? fun(T t, U u)
{
    ...
    return t + u;
}

该模板函数的返回值如何确定呢?首先很容易想到的是将decltype(t+u)设置为该模板函数的返回值,但是不行的是,此时还未声明xy,编译器还识别不到他们,更无法使用他们,因此,C++11新增了返回值类型后置的这种语法,针对上述的模板函数,使用新增的语法可以写为:

template<typename T, typename U>
auto fun(T t, U u) -> decltype(t + u) //此时decltype在参数t和u声明的后面,可以正常使用他们
{
    ...
    return t+u;
}

参考文献

C++ Primer Plus(第六版) - 第18章 探讨C++新标准

相关文章

  • C++11——string,vector,数组

    使用auto或decltype作为类型缩写 此处line.size()返回一个string::size_type类...

  • decltype

    decltype是用于进行类型推导的。typeid用于运行时动态获取类型信息。返回相应变量对应的type_info...

  • C++11中auto和decltype

    C++11中auto和decltype auto和decltype都是C++11中引进来用于自动推断类型的关键字,...

  • C++11新特性(16)-返回类型后置

    返回类型后置 除了构造函数和析构函数以外,函数声明都需要明确函数的返回类型,在传统的C或者C++中,函数声明大致是...

  • C++11之decltype

    decltype是一种新的操作符,用于获取表达式的数据类型。使用方法和sizeof操作符类似。 decltype(...

  • decltype关键字

    C++11新标准学习:decltype关键字 1. decltype的意义 有时我们希望从表达式的类型推断出要定义...

  • nullptr

    decltype 用于类型推导,而 std::is_same 用于比较两个类型是否相同. 将输出: 结论 NULL...

  • C++11类型推导

    C++11 重新定义了auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。 au...

  • C++系列 --- 函数新特性、内联函数、const详解

    一、函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型。 函数声...

  • 005 decltype 类型指示符

    它的作用是选择并返回操作数的数据类型。 编译器并不实际调用函数 f,而是使用当调用发生时 f 的返回值类型作为 s...

网友评论

      本文标题:decltype和返回类型后置

      本文链接:https://www.haomeiwen.com/subject/dqutkdtx.html