我在VS 2017中使用scoped_locked时遇到了一些问题。我相信我将它们追溯到了<mutex>声明,如下所示。开始使用scoped_lock时禁用#if开关的最安全方法是什么?再次感谢。
#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;
};发布于 2018-04-17 23:46:22
从您的问题看,您不清楚是否要禁用/启用此行为。但一般来说,这可以通过/std:c++latest编译器参数和/或覆盖_HAS_CXX17来控制,如Visual C++ Team Blog中所述。问题是如果没有ovverides,_HAS_CXX17的定义取决于yvals.h中的编译器版本(参见this问题),因此这可能会因Visual Studio的版本而异(所以我不能给你一个直接的答案,什么组合将给你所需的结果,因为它不清楚你是否想要禁用/启用它,以及你的Visual Studio的确切版本)。正如文章中提到的,这有一个缺点,那就是您可能会失去其他特性,因为它们没有提供对STL的细粒度控制。但是您可以尝试看看恢复到旧的STL行为是否会给您带来问题。
https://stackoverflow.com/questions/49882137
复制相似问题