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