【问题标题】:Should non-capturing generic lambdas decay to function pointers?非捕获通用 lambdas 是否应该衰减为函数指针?
【发布时间】:2017-05-10 02:01:24
【问题描述】:

考虑以下代码:

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

GCCclang 都可以正常工作。
让我们考虑以下稍作修改的版本:

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

在这种情况下,clang 仍然是 accepts it 而 GCC rejects it

有什么理由应该拒绝这段代码还是编译器的错误?


我将打开一个问题,但我想知道是否存在任何可以由其中一个而不是由另一个执行的提案。

【问题讨论】:

  • GCC 编译器 (5.1.0) 告诉您它未实现:“抱歉,未实现:将使用 '...' 的 lambda 转换为函数指针”
  • @latedeveloper Ahahah... 我在手机上试过了,错误信息更短(可能被删掉了),而手机上的 Godbolt 远非用户友好。不错,没看到所以,我不会打开任何问题,他们已经知道了!!谢谢你。我要结束我自己的问题。
  • 错误信息很清楚,这里没有实际问题。
  • 你只是想要一顶帽子来投票结束你自己提出的问题,对吧?
  • @DavidHammen 老实说,我什至不知道这种帽子是否存在。我对那些东西没那么感兴趣。您希望我删除问题吗?我只是把它留给未来的读者,从我的角度来看,这比戴帽子更有意义。

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


【解决方案1】:

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

不用说[](auto, ...){} 不能转换为void (*)(int)

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

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2011-11-14
    • 2016-10-25
    • 2020-10-02
    • 2020-10-07
    • 2021-12-01
    相关资源
    最近更新 更多