c++ - `std::promise::set_value` 修改给定值
问题描述
我有一个std::promise
. 我调用set_value
并传入一个对象。它是一个元组,包含一个带有两个成员变量的自定义对象。
这最终调用_Set_value_raw
inside std::_Associated_state
。
void _Set_value_raw(_Ty&& _Val, unique_lock<mutex>* _Lock,
bool _At_thread_exit) {
if (_Has_stored_result) {
_Throw_future_error(make_error_code(future_errc::promise_already_satisfied));
}
_Result = _STD forward<_Ty>(_Val);
_Do_notify(_Lock, _At_thread_exit);
}
_Val
是我传入的对象std::promise::set_value
,它具有以下值(稍作编辑以便于阅读):
_Val = ({mFoo=unique_ptr {...}, mBar=unique_ptr {...}})
这很棒。_Result = _STD forward<_Ty>(_Val);
将执行,并且承诺将包含我的对象。但是,如果我在该行执行后检查 的值_Result
,我的对象已经改变。
_Result = ({mFoo=empty, mBar=unique_ptr {...}})
对象的基础成员变量之一 ( mFoo
) 现在为空或nullptr
.
这只发生在 Visual-C++ 中。Clang 不会发生此问题。
有谁知道发生了什么?
解决方案
推荐阅读
- c# - 使用 HttpClient.GetAsync() 使用具有基本身份验证的 WCF REST 服务会导致 (401) Unauthorized
- api - 使用 IBM hpc-cluster api 时,如何使用 IAM 令牌进行身份验证?
- excel - 只有当一个条件为真而另一个条件为假时,excel中是否有办法突出显示一行?
- c - 运行 PyArray_Max 命令时程序崩溃
- acumatica - 在支付和应用程序屏幕中使用“余额 W0”
- javascript - 在 Vue.js 中使用 CSS/JS/jQuery 主题
- wordpress - 按修改日期而不是 wordpress 中的发布日期拉帖子
- postman - 如何在邮递员代码片段中获取基于 linux 的代码而不是基于 Windows 的代码
- firewall - 文件上传限制为 1M,即使在 PHP、Nginx 和 Apache 配置之后
- javascript - 创建以图像为属性的 javascript 对象