空指针传递给lambda函数不再为空
Null pointer passed to lambda function is not null anymore
我尝试将null指针作为对lambda函数的引用,但它将接收一个内存地址而不是保持null。
function<void(json)> doTheThing(){
...
pointer = nullptr;
return [&](json object) {
if(pointer != nullptr) {
cout<<"pointer not null";
}
}
任何想法如何通过该指针,以保持零?
[&]
表示隐式捕获。
如果您通过引用捕获某些内容,则只要存在,它才保持在定义的状态中。您似乎正在返回转换为std::function
的lambda。通过引用捕获是一个非常糟糕的主意。
局部变量超出范围。在lambda中捕获的对其的引用现在处于未定义状态,所有使用都是不确定的行为。然后,您将此lambda的副本返回std::function
,调用它,然后鼻恶魔将您的鼻子射出;或者以您的情况,指针不会出现null。
永远不要在其寿命(其副本寿命)将超过当前范围的lambda中隐式捕获。
通常,即使使用[=]
,也永远不会隐式捕获这种情况。明确。
std::function<void(json)> doTheThing() {
void* pointer = nullptr;
return [pointer](json object) {
if(pointer != nullptr) {
std::cout<<"pointer not null";
}
};
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Windows 函数 "NetUserChangePassword" 在 Windows 10 下不再工作(在 Windows 7 下工作)
- Visual Studio在创建类时不再生成构造函数/解构器
- 实现上下文切换 - 第二个函数不再运行
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- 如果构造函数被显式默认或删除,为什么聚合初始化自 C++20 以来不再起作用
- 空指针传递给lambda函数不再为空
- tr()函数不再起作用,从QT 4到QT 5迁移
- 为什么当定义析构函数时,编译器不再添加默认的move函数和赋值函数
- 如何写函数整洁?考虑到log,一次返回,不再缩进
- 已经或将要使用C++14或C++1z使其不再未定义调用委托类成员函数指针
- 根据定义,将"虚拟析构函数放入接口内"不会使它不再是接口吗?
- 从lambda的内部框架修改via闭包中的变量安全吗?lambda是从一个不再存在的函数创建的