非捕获通用lambda是否应该衰减到函数指针?

时间:2016-12-24 21:55:49

标签: c++ gcc clang c++14 generic-lambda

请考虑以下代码:

int main() {
    auto l = [](auto){};
    void(*p)(int) = l;
}

GCCclang都可以正常使用 让我们考虑以下略微修改的版本:

int main() {
    auto l = [](auto...){};
    void(*p)(int) = l;
}

在这种情况下,当GCC accepts it时,铿锵rejects it

是否有任何理由拒绝此代码或是否是编译器的错误?

我打算开一个问题,但我想知道是否有任何提案可以由其中一个提出,而不是由另一方提出。

1 个答案:

答案 0 :(得分:11)

这是一个已知的GCC解析错误(6409568071):[](auto...){}被错误地解析为[](auto, ...) {}而不是[](auto...x){};省略号被解析为C风格的变量而不是声明参数包(在语言 - 律师术语中,它被解析为 parameter-declaration-clause 的一部分,而不是< em> abstract-declarator ,违反了[dcl.fct]/17)。

不言而喻,[](auto, ...){}无法转换为void (*)(int)

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