为什么lambda删除cv和ref?

vla*_*don 5 c++ lambda language-lawyer c++11 return-type-deduction

鉴于lambda:

auto f = [](const T& var){ return var; };
Run Code Online (Sandbox Code Playgroud)

为什么返回类型fT(不const T&)?这个标准在哪里?

son*_*yao 5

重点是:

  1. 使用auto返回类型推导采用模板类型推导规则.
  2. 返回类型被指定为值传递; 这意味着var忽略用于演绎(即)的表达式的引用和顶级cv限定符.

标准引用:

关于汽车:

如果占位符是自动类型说明符,则使用模板参数推导的规则确定推断类型T'替换T. 通过使用新发明的类型模板参数U替换auto的出现来获取P,或者如果初始化是copy-list-initialization,则使用std :: initializer_list替换auto的出现.使用函数调用中的模板参数推导规则([temp.deduct.call])推导U的值,其中P是函数模板参数类型,相应的参数是e.如果扣除失败,则声明格式不正确.否则,通过将推导的U代入P来获得T'.

关于函数调用模板参数推导规则:

如果P不是引用类型:

  • 如果A是cv限定类型,则类型推导将忽略A类型的顶级cv限定符.

关于参考:

如果表达式最初具有"对T的引用"类型([dcl.ref],[dcl.init.ref]),则在进行任何进一步分析之前将类型调整为T.

因此,对于var(即A)const T&,推导的返回类型将在T这里.