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"; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |