在扣除auto之前不能使用捕获的变量

时间:2017-03-27 18:57:55

标签: c++ lambda c++14

此问题与此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

1 个答案:

答案 0 :(得分:5)

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

int(foo); int (foo);int foo;。然后foo中的(void)(foo);引用int

第一个代码段会遇到[dcl.spec.auto]/10

  

如果需要具有未减少占位符类型的实体的类型   为了确定表达式的类型,程序是不正确的。

需要foo的类型来确定lambda体内表达式foo的类型,但此时你还没有推导出foo的类型,所以该计划格式不正确。