首页 > 解决方案 > `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++visual-studiovisual-c++promise

解决方案


推荐阅读