加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 这个lambda捕获问题是gcc编译器错误吗?

发布时间:2020-12-16 09:55:37 所属栏目:百科 来源:网络整理
导读:最低工作示例: #include iostream#include memory#include stringint main(){ std::shared_ptrstd::string i = std::make_sharedstd::string("foo"); auto f = [=]() { i.reset(); std::cout i.get() "n"; }; std::cout i.use_count() "n"; f(); std::cou
最低工作示例:

#include <iostream>
#include <memory>
#include <string>

int main()
{
    std::shared_ptr<std::string> i = std::make_shared<std::string>("foo");

    auto f = [=]()
        {
            i.reset();
            std::cout << i.get() << "n";
        };

    std::cout << i.use_count() << "n";
    f();
    std::cout << i.use_count() << "n";
}

编译错误:

$g++ -std=c++11 /tmp/foo.cpp 
/tmp/foo.cpp: In lambda function:
/tmp/foo.cpp:11:12: error: passing ‘const std::shared_ptr<std::basic_string<char> >’ as ‘this’ argument of ‘void std::__shared_ptr<_Tp,_Lp>::reset() [with _Tp = std::basic_string<char>; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’ discards qualifiers [-fpermissive]
    i.reset();

我相信我应该被捕获为一个值,但它似乎被捕获为一个const值.

编译器版本:

g++ (GCC) 4.9.2 20141101 (Red Hat 4.9.2-1)

解决方法

shared_ptr是闭包对象的成员. operator()标记为const.因此,您不能修改i,即调用非const成员函数,如reset.

尝试

auto f = [=]() mutable
{
    i.reset();
    std::cout << i.get() << "n";
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读