考虑以下代码:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
它适用于GCC和clang。
让我们考虑以下稍作修改的版本:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
是否有任何理由应该拒绝此代码或者它是编译器的错误?
我将提出一个问题,但我想知道是否存在任何可以由其中一个而不是由另一个执行的提案。
这是一个已知的 GCC 解析错误(64095、68071):被错误地解析为; 省略号被解析为 C 风格的 varargs 而不是声明参数包(在语言律师术语中,它被解析为parameter-declaration-clause而不是abstract-declarator的一部分,违反[dcl.fct] /17 )。[](auto...){}
[](auto, ...) {}
[](auto...x){}
不言而喻,[](auto, ...){}
它不能转换为void (*)(int)
.
解决方法是给包起个名字;如果这样做,您将看到转换编译成功。