[英]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.