• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2026-08-06 14:52 Aet 隐藏边栏 |   抢沙发  3 
文章评分 1 次,平均分 5.0

概述

  1. decltypeC++11 引入,用来在编译期获取一个实体或表达式的类型
  2. 它与 auto 最大的区别是:
    1. auto 通常会进行类型退化,而 decltype 会精确保留 const、引用、数组以及表达式的值类别

规则一:未加括号的名字或成员访问

  1. 如果操作数是:
    1. 未加括号的变量名
    2. 未加括号的类成员访问
    3. 那么结果是该实体声明时的类型

  1. 尤其注意:

规则二:其他所有表达式

表达式值类别 decltype(expr)
lvalue 左值 T&
xvalue 将亡值 T&&
prvalue 纯右值 T

括号为什么会改变结果

  1. 括号不会改变 x 的值类别,但会使它避开规则一,进入表达式规则

根据值类别推导

左值产生 T&

  1. 常见左值表达式包括
    1. 变量名
    2. 解引用
    3. 下标访问
    4. 前置自增
    5. 返回左值引用的函数

  1. 数组下标通常也是左值
    1. 注意,array[0] 不是简单变量名,因此直接使用表达式规则,不需要额外加括号

将亡值产生 T&&

  1. std::move(x) 本身不执行移动,只把 x 转换为将亡值,所以:

  1. 返回右值引用的函数调用也是将亡值

纯右值产生 T

  1. 返回值类型为 T 的函数调用通常是纯右值

函数返回值的推导

  1. 假设

  1. 那么

成员访问的特殊规则

  1. 未加括号:看成员的声明类型

  1. 加括号:看表达式值类别

数组和函数不会自动退化

数组

字符串字面量

函数

  1. 第一个是函数类型,第二个是函数左值引用

条件表达式的推导

  1. 条件表达式的值类别取决于第二、第三个操作数

相同类型的两个左值

  1. 因为 ab 都是相同类型的左值,条件表达式结果也是左值

  1. 下面代码的危险所在

decltype 不会执行表达式

  1. decltype 的操作数属于不求值操作数

decltype(auto)

  1. C++14 引入 decltype(auto),它会对初始化表达式使用完整的 decltype 规则

decltype(auto) 返回值陷阱

  1. case

  1. 推导过程

返回成员时的微妙差别

  1. case

  1. 返回表达式是未加括号的成员访问
    1. 所以函数按值返回,会复制字符串

  1. 加上括号:

auto推导规则

C++_ 引用折叠、万能引用、完美转发、auto推导、函数指针引用、顶层const、底层const)

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享