繁体   English   中英

const 方法中的非常量 lambda 捕获

[英]Non-const lambda capture in const method

#include <iostream>
#include <functional>

class Blub {
public:
    int i = 0;
    std::function<void()> create() const {
        return [this]() {
            this->i = 100;
        };
    }
};

int main() {
    Blub blub = Blub();
    blub.create()();
    std::cout << blub.i << std::endl;
    return 0;
}

我知道this在 lambda 中被捕获为 const,因为该方法被标记为 const。 除了删除方法的常量之外,还有没有办法存档我可以修改 lambda 函数内的成员变量?

添加mutable关键字不起作用。

您可以将成员变量i声明为mutable ,这样即使对象声明为const ,它也可以更改:

class Blub {
public:
    mutable int i = 0;
//  ^^^^^^^
    std::function<void()> create() const {
        return [this]() {
            this->i = 100;
        };
    }
};

在这里

您可以执行以下解决方法

class Blub {
public:
    int i = 0;
    std::function<void()> create() const {
        return [my_this=const_cast<Blub*>(this)]() {
            my_this->i = 100;
        };
    }
};

但是在实际标记为const的函数中更改数据成员会产生误导,因此我不建议以这种方式设计您的类。

现场查看。

NB值得一提的是, const_cast仅在用于强制转换最初为非const的变量时才可以安全使用。 如果变量最初是const ,则使用const_cast可能会导致未定义行为。 因此,在以下代码中(由 OP 提供):

int main() {
    Blub blub = Blub();
    blub.create()();
    std::cout << blub.i << std::endl;
    return 0;
}

使用const_cast是安全的,因为 object 最初是非const 但是,如果我们像下面的代码一样让它成为const

int main() {
    const Blub blub = Blub();
    blub.create()();
    std::cout << blub.i << std::endl;
    return 0;
}

它将导致未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM