考虑以下代码:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
两者都可以很好地工作GCC https://godbolt.org/g/wSibNo and clang https://godbolt.org/g/OUnVqp.
让我们考虑以下稍微修改的版本:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
在这种情况下,clang仍然接受它 https://godbolt.org/g/keWVhw而海湾合作委员会拒绝它 https://godbolt.org/g/eQP5yd.
是否有任何原因应该拒绝此代码,或者它是编译器的错误?
我要提出一个问题,但我想知道是否存在任何提案可以由其中一个而不是另一个实施。
这是一个已知的 GCC 解析错误(64095 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64095, 68071 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68071): [](auto...){}
被错误地解析为[](auto, ...) {}
而不是[](auto...x){}
;省略号被解析为 C 风格的可变参数,而不是声明一个参数包(用语言律师的术语来说,它被解析为参数声明子句而不是抽象声明符,违反[dcl.fct]/17 https://timsong-cpp.github.io/cppwp/dcl.fct#17).
不言而喻[](auto, ...){}
不能转换为void (*)(int)
.
解决方法是给包命名;如果这样做,您将看到转换编译成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)