c-VS 2017程序无法识别“ scoped_lock”

我在VS 2017中使用scoped_locked遇到了问题.我相信我可以将其追溯到< mutex>中.声明,复制如下.在开始时禁用#if开关以使用scoped_lock的最安全方法是什么?再次感谢.

#if _HAS_CXX17
// CLASS TEMPLATE scoped_lock
template<class... _Mutexes>
class scoped_lock
{   // class with destructor that unlocks mutexes
public:
    explicit scoped_lock(_Mutexes&... _Mtxes)
    : _MyMutexes(_Mtxes...)
    {   // construct and lock
    _STD lock(_Mtxes...);
    }

    explicit scoped_lock(adopt_lock_t, _Mutexes&... _Mtxes)
    : _MyMutexes(_Mtxes...)
    {   // construct but don't lock
    }

    ~scoped_lock() _NOEXCEPT
    {   // unlock all
    _For_each_tuple_element(
        _MyMutexes,
        [](auto& _Mutex) _NOEXCEPT { _Mutex.unlock(); });
    }

    scoped_lock(const scoped_lock&) = delete;
    scoped_lock& operator=(const scoped_lock&) = delete;
private:
    tuple<_Mutexes&...> _MyMutexes;
};

解决方法:

从您的问题尚不清楚您是否要禁用/启用此行为.但是通常可以使用/ std:c最新的编译器参数和/或覆盖Visual C++ Team Blog中所述的_HAS_CXX17进行控制.问题在于,没有ovverides时,_HAS_CXX17的定义取决于yvals.h中的编译器版本(请参见this问题) ),因此这可能会因Visual Studio的版本而异(因此,我无法给您一个直观的答案,哪种组合会为您提供所需的结果,因为尚不清楚您是否要禁用/启用它,并且不清楚确切的Visual Studio版本).如文章中所述,这样做的缺点是您可能会放弃其他功能,因为它们未提供对STL的精细控制.但是您可以尝试看看恢复到旧的STL行为是否会给您造成问题.

上一篇:c-为什么boost :: filesystem :: path和std :: filesystem :: path缺少运算符?


下一篇:c-boost :: combine,基于范围的for和结构化绑定