【问题标题】:Can't use captured variable before deduction of auto在扣除自动之前不能使用捕获的变量
【发布时间】:2017-03-27 18:57:54
【问题描述】:

这个问题和这个one有关。

为什么不编译:

int main() {
    auto foo = [&]() -> int {foo; return {};}();
    (void)(foo);
}

LIVE on Coliru

错误:

main.cpp: In lambda function:
main.cpp:3:30: error: use of 'foo' before deduction of 'auto'
     auto foo = [&]() -> int {foo; return {};}();
                              ^~~

但是将 foo 转换为结果类型允许编译:

int main() {
    auto foo = [&]() -> int {int(foo); (void)(foo);return {};}();
    (void)(foo);
}

LIVE on Coliru

【问题讨论】:

  • 我不明白。 foo 是一个返回 int 的 lambda,而不是 int... 你是不是要调用 lambda auto foo = [&](){...}();
  • @YSC 抱歉,正在编辑。

标签: c++ lambda c++14


【解决方案1】:

Vexing 再次解析。如果某事可以是声明,那就是声明。

int(foo);int (foo);int foo;。那么(void)(foo);中的foo指的是int


第一个 sn-p 运行到[dcl.spec.auto]/10:

如果需要具有未推断占位符类型的实体类型 要确定表达式的类型,程序是非良构的。

需要foo 的类型来确定lambda 主体中表达式foo 的类型,但此时您还没有推断出foo 的类型,因此程序格式错误.

【讨论】:

  • 据我所知,这只是答案的一半。我猜 OP 想知道一种解决方法并在 lambda 中使用 foo
  • 我明白了。但是为什么第一个例子不编译,因为 foo 类型应该是已知的,因为 lambda 有明确的返回类型?
  • @BlackMoses 添加更多信息:lambda 的类型取决于其主体(例如,确定哪些实体被捕获并成为生成类的成员)。它的类型不仅仅由它的参数和返回类型决定。然后,您通过捕获使其主体取决于其类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2021-04-19
  • 2017-09-16
相关资源
最近更新 更多