微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ lambda 按值语义捕获?

如何解决C++ lambda 按值语义捕获?

class TestGetStr {
public:
    string a;
    string getString() {
        return a;
    }
};

void acceptConstString(const string & a) {
    std::cout << a << std::endl;
}

int main(int argc,const char * argv[]) {
    
    auto testGetStr = TestGetstr();

    acceptConstString(testGetStr.getString()); //compile ok

    auto testaaa = [testGetStr](){

//compile error 'this' argument to member function 'getString' has type 'const TestGetStr',but function is not marked const        
acceptConstString(testGetStr.getString());
    };
    

普通调用和 lambda 捕获的区别?

普通调用可以编译,但是lambda调用不能编译。

为什么?感谢您提供更多详细信息。

解决方法

您可以添加 mutable 限定符。

auto testaaa = [testGetStr]() mutable {
//                            ^^^^^^^
    acceptConstString(testGetStr.getString());
};

否则 lambdaoperator() 是 const 限定的,然后无法在捕获的对象上调用非常量成员函数。

  • mutable:允许body修改复制捕获的对象,并调用它们的非常量成员函数

除非在 lambda 表达式中使用关键字 mutable,否则 函数调用运算符是 const 限定的,并且对象是 复制捕获的内容不可从该 operator() 内部修改。

PS:或者更好地制作 TestGetStr::getString() const 成员函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。