VS 2017程序无法识别“scoped_lock”

时间:2018-04-17 15:31:29

标签: c++ c++17

我在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;
};

1 个答案:

答案 0 :(得分:1)

根据您的问题,您不清楚是否要禁用/启用此行为。但一般来说,这可以通过/std:c++latest编译器参数和/或覆盖_HAS_CXX17来控制,如Visual C++ Team Blog中所述。问题是如果没有ovverides,_HAS_CXX17的定义取决于yvals.h中的编译器版本(请参阅this问题),因此这可能会因Visual Studio的版本而异(所以我可以不能直接回答组合会给你所需的结果,因为不清楚是否要禁用/启用它,以及你的确切Visual Studio版本是什么。正如文章中提到的,这有一个缺点,你可能会失去其他功能,因为它们没有提供对STL的细粒度控制。但您可以尝试查看是否恢复旧的STL行为会导致问题。