sky*_*ack 7 c++ gcc clang generic-lambda c++14
请考虑以下代码:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
Run Code Online (Sandbox Code Playgroud)
它与GCC和clang一起工作得很好.
让我们考虑以下略微修改的版本:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何理由拒绝此代码或是否是编译器的错误?
我打算提出一个问题,但我想知道是否有任何提案可以由其中一个提出,而不是由另一个提出.
T.C*_*.C. 11
这是一个已知GCC解析错误(64095,68071):[](auto...){}被错误地解析等[](auto, ...) {},而不是[](auto...x){}; 省略号被解析为C风格的变量而不是声明参数包(在语言 - 律师术语中,它被解析为参数声明子句的一部分而不是抽象声明符,违反了[dcl.fct]/17).
不言而喻,这[](auto, ...){}是不可兑现的void (*)(int).
解决方法是给包装一个名字; 如果你这样做,你会看到转换成功编译.