常量方法中的非常量 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
的函数中更改数据成员是误导性的,所以我不建议以这种方式设计您的类。
现场查看。
注:注:值得一提的是,只有当const_cast
用于强制转换最初非const
的变量时,它才能安全使用。如果变量最初是const
的,使用const_cast
可能会导致未定义的行为。因此,在以下代码(OP 提供(中:
int main() {
Blub blub = Blub();
blub.create()();
std::cout << blub.i << std::endl;
return 0;
}
使用const_cast
是安全的,因为对象最初是非const
的。但是,如果我们像下面的代码一样const
它:
int main() {
const Blub blub = Blub();
blub.create()();
std::cout << blub.i << std::endl;
return 0;
}
这将导致未定义的行为。
相关文章:
- #定义c-预处理器常量..我做错了什么
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用自动推导的 lambda 参数作为常量表达式
- 常量方法中的非常量 lambda 捕获
- 不是 lambda 函数中的常量表达式
- 我们应该在 lambda 中通过常量引用来捕获吗?
- 为什么 lambda 对象中的局部变量是常量变量?
- 无法使用带有常量引用的 lambda 对 std::vector 进行排序
- 如何避免使用 lambda 进行代码重复的常量和非常量集合处理
- C++ lambda 到 std::函数错误与非常量字符串
- 为什么 lambda 自动和参数选择常量重载?
- C++ 为什么编译器无法生成返回 Lambda 中捕获变量的常量引用的代码
- 传递非自动常量左值引用时,for_each、map和lambda出错
- 如何使可变 lambda 捕获列表的某些成员变得非常量
- 从常量和引用的角度来看,函数应该如何接受*lambda*参数
- 无效方法和 lambda "技巧"中的常量正确性
- Lambda Capture by Value强制所有作用域对象为常量
- boost绑定或返回常量的lambda函数
- Lambda-expression作为常量表达式的未求值子表达式
- 在lambda捕获列表中传递常量引用