非捕获通用 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)

解决方法是给包起个名字;如果这样做,您会看到转换编译成功。