簡體   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