此问题与此one有关。
为什么不编译:
int main() {
auto foo = [&]() -> int {foo; return {};}();
(void)(foo);
}
错误:
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);
}
答案 0 :(得分:5)
Vexing再次解析。如果某事可以是宣言,那就是宣言。
int(foo);
int (foo);
是int foo;
。然后foo
中的(void)(foo);
引用int
。
第一个代码段会遇到[dcl.spec.auto]/10:
如果需要具有未减少占位符类型的实体的类型 为了确定表达式的类型,程序是不正确的。
需要foo
的类型来确定lambda体内表达式foo
的类型,但此时你还没有推导出foo
的类型,所以该计划格式不正确。