非捕获通用 lambda 应该衰减为函数指针吗?
Should non-capturing generic lambdas decay to function pointers?
考虑以下代码:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
它与 GCC and clang 都工作得很好。
让我们考虑以下稍作修改的版本:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
这种情况下,clang还是accepts it while GCC rejects it。
是否有任何理由拒绝此代码,或者它是编译器的错误?
我要打开一个问题,但我想知道是否存在任何可以由其中一个而不是另一个实施的提案。
这是一个已知的 GCC 解析错误 (64095, 68071): [](auto...){}
is being mistakenly parsed like [](auto, ...) {}
rather than [](auto...x){}
; the ellipsis is being parsed as C-style varargs rather than declaring a parameter pack (in language-lawyer terms, it's being parsed as part of the parameter-declaration-clause rather than the abstract-declarator, in violation of [dcl.fct]/17)。
不用说 [](auto, ...){}
不能转换为 void (*)(int)
。
解决方法是给包起个名字;如果这样做,您会看到转换编译成功。
考虑以下代码:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
它与 GCC and clang 都工作得很好。
让我们考虑以下稍作修改的版本:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
这种情况下,clang还是accepts it while GCC rejects it。
是否有任何理由拒绝此代码,或者它是编译器的错误?
我要打开一个问题,但我想知道是否存在任何可以由其中一个而不是另一个实施的提案。
这是一个已知的 GCC 解析错误 (64095, 68071): [](auto...){}
is being mistakenly parsed like [](auto, ...) {}
rather than [](auto...x){}
; the ellipsis is being parsed as C-style varargs rather than declaring a parameter pack (in language-lawyer terms, it's being parsed as part of the parameter-declaration-clause rather than the abstract-declarator, in violation of [dcl.fct]/17)。
不用说 [](auto, ...){}
不能转换为 void (*)(int)
。
解决方法是给包起个名字;如果这样做,您会看到转换编译成功。