首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::向前不工作在羔羊身上?

为什么std::向前不工作在羔羊身上?
EN

Stack Overflow用户
提问于 2021-12-03 11:06:06
回答 2查看 195关注 0票数 3
代码语言:javascript
复制
#include <utility>

void f(auto const& fn1)
{
    {
        auto fn2 = std::forward<decltype(fn1)>(fn1);
        auto fn3 = std::forward<decltype(fn2)>(fn2); // ok
        fn3();
    }

    [fn2 = std::forward<decltype(fn1)>(fn1)]
    {
        auto const fn3 = fn2;
        auto fn4 = std::forward<decltype(fn3)>(fn3); // ok
        fn4();
    
        auto fn5 = std::forward<decltype(fn2)>(fn2); // error
        fn5();
    }();
}

int main()
{
    f([] {});
}

哥德波特演示

为什么 std::forward 不工作在羔羊身上?

更新信息:

g++很好,但是clang++拒绝它。谁是对的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-03 11:32:20

拒绝它是正确的。

decltype(fn2)给出了fn2的类型,假设lambda闭包类型是T,那么它就是T。lambda的函数调用操作符是const-合格的,那么std::forward<decltype(fn2)>(fn2)就不能被调用.std::forward的模板参数显式地指定为T,那么std::forward<decltype(fn2)>应该接受T& (和T&&)作为它的参数类型,但是const fn2不能绑定到non

作为解决办法,您可以将lambda标记为mutable

代码语言:javascript
复制
[fn2 = std::forward<decltype(fn1)>(fn1)] mutable
{
    auto fn3 = std::forward<decltype(fn2)>(fn2); // fine
    fn3();
}();
票数 5
EN

Stack Overflow用户

发布于 2021-12-03 11:15:07

lambda的捕获是闭包类的成员,主体是operator() const

您正试图在const成员函数中移动类的数据成员,这正是编译器错误告诉您的。

代码语言:javascript
复制
note: candidate function template not viable: 1st argument ('const (lambda at <source>:20:7)') would lose const qualifier
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70213317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档