首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型推演参考

类型推演参考
EN

Stack Overflow用户
提问于 2015-05-14 15:10:44
回答 3查看 71关注 0票数 0

我看到了this answer,但我并不满意:在标准中,“auto”的类型扣减不考虑默认参数在哪里呢?

代码语言:javascript
复制
int main() {
    auto lambda = [] (auto subl = [] {}) {};
    lambda();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-14 15:25:54

auto根据模板参数演绎(dcl.spec.auto /p7)使用规则:

如果占位符是自动类型说明符,则使用模板参数演绎规则确定推导的类型。

当默认参数的类型是推导出的模板参数时,默认参数显式地是一个非推导的上下文(tem.duct.type/p5):

未推导的上下文如下: -使用限定-id指定的类型的嵌套名称说明符。-解密型说明符的表达式。-非类型模板参数或数组绑定,其中子表达式引用模板参数。-在函数参数的参数类型中使用的模板参数,该参数具有一个默认参数,该参数用于正在对其进行参数推导的调用中。

票数 3
EN

Stack Overflow用户

发布于 2015-05-14 15:35:29

来自expr.prim.lambda

5-.对于泛型lambda,闭包类型有一个公共内联函数调用操作符成员模板(14.5.2),其模板参数列表包括一个已发明的类型模板-参数参数,用于按出现顺序在lambda的参数声明-子句中出现auto。..。

模板参数不能从默认参数推断;temp.deduct.call

5-.

默认参数是非推导的上下文(temp.deduct.type/5).。

票数 1
EN

Stack Overflow用户

发布于 2015-05-14 15:32:29

为了补充上面所说的,lamda中的默认参数可以使您在捕获列表时“欺骗”。正如我们都知道的,您必须使用捕获列表“捕获”外部参数:

代码语言:javascript
复制
int x=7;
auto func = [&x](){ return x+1 ;}

如果可以使用默认参数,则可以在捕获列表上“欺骗”,只需使用默认参数设置一个引用:

代码语言:javascript
复制
int x=7;
auto func = [](const int& y = x){ return y+1 ;}

防止默认参数使您无法捕获外部参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30240851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档