我看到了this answer,但我并不满意:在标准中,“auto”的类型扣减不考虑默认参数在哪里呢?
int main() {
auto lambda = [] (auto subl = [] {}) {};
lambda();
}发布于 2015-05-14 15:25:54
auto根据模板参数演绎(dcl.spec.auto /p7)使用规则:
如果占位符是自动类型说明符,则使用模板参数演绎规则确定推导的类型。
当默认参数的类型是推导出的模板参数时,默认参数显式地是一个非推导的上下文(tem.duct.type/p5):
未推导的上下文如下: -使用限定-id指定的类型的嵌套名称说明符。-解密型说明符的表达式。-非类型模板参数或数组绑定,其中子表达式引用模板参数。-在函数参数的参数类型中使用的模板参数,该参数具有一个默认参数,该参数用于正在对其进行参数推导的调用中。
发布于 2015-05-14 15:35:29
来自expr.prim.lambda
5-.对于泛型lambda,闭包类型有一个公共内联函数调用操作符成员模板(14.5.2),其模板参数列表包括一个已发明的类型模板-参数参数,用于按出现顺序在lambda的参数声明-子句中出现
auto。..。
模板参数不能从默认参数推断;temp.deduct.call
5-.
默认参数是非推导的上下文(temp.deduct.type/5).。
发布于 2015-05-14 15:32:29
为了补充上面所说的,lamda中的默认参数可以使您在捕获列表时“欺骗”。正如我们都知道的,您必须使用捕获列表“捕获”外部参数:
int x=7;
auto func = [&x](){ return x+1 ;}如果可以使用默认参数,则可以在捕获列表上“欺骗”,只需使用默认参数设置一个引用:
int x=7;
auto func = [](const int& y = x){ return y+1 ;}防止默认参数使您无法捕获外部参数。
https://stackoverflow.com/questions/30240851
复制相似问题