请考虑以下代码:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
GCC和clang都可以正常使用 让我们考虑以下略微修改的版本:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
在这种情况下,当GCC accepts it时,铿锵rejects it。
是否有任何理由拒绝此代码或是否是编译器的错误?
我打算开一个问题,但我想知道是否有任何提案可以由其中一个提出,而不是由另一方提出。
答案 0 :(得分:11)
这是一个已知的GCC解析错误(64095,68071):[](auto...){}
被错误地解析为[](auto, ...) {}
而不是[](auto...x){}
;省略号被解析为C风格的变量而不是声明参数包(在语言 - 律师术语中,它被解析为 parameter-declaration-clause 的一部分,而不是< em> abstract-declarator ,违反了[dcl.fct]/17)。
不言而喻,[](auto, ...){}
无法转换为void (*)(int)
。
解决方法是给包装一个名字;如果你这样做,你会看到转换成功编译。