Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS 2017计划不承认“不承认”;范围为“U锁”;_C++_C++17 - Fatal编程技术网

C++ VS 2017计划不承认“不承认”;范围为“U锁”;

C++ VS 2017计划不承认“不承认”;范围为“U锁”;,c++,c++17,C++,C++17,我在VS 2017中使用scoped_时遇到问题。我相信我把它们追溯到了声明,复制如下。如果在开始使用范围锁定开关时禁用#if开关,最安全的方法是什么?再次感谢 #if _HAS_CXX17 // CLASS TEMPLATE scoped_lock template<class... _Mutexes> class scoped_lock { // class with destructor that unlocks mutexes public: explicit s

我在VS 2017中使用scoped_时遇到问题。我相信我把它们追溯到了
声明,复制如下。如果在开始使用范围锁定开关时禁用
#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;
};
\if\u有CXX17
//类模板作用域锁定
模板
类作用域锁定
{//类,具有解锁互斥锁的析构函数
公众:
显式作用域\u锁(\u互斥锁和…\u mtx)
:_mymutex(_Mtxes…)
{//构造并锁定
_标准锁(_Mtxes…);
}
显式作用域\u锁(采用\u锁\u t、\u互斥锁和…\u mtx)
:_mymutex(_Mtxes…)
{//构造但不锁定
}
~scoped_lock()_NOEXCEPT
{//全部解锁
_对于每个\u元组\u元素(
_我的互斥体,
[](自动和互斥){{u Mutex.unlock();});
}
作用域锁定(常量作用域锁定&)=删除;
作用域锁定&运算符=(常量作用域锁定&)=删除;
私人:
元组_mymutex;
};

根据您的问题,不清楚是否要禁用/启用此行为。但一般来说,这可以通过
/std:c++最新的
编译器参数和/或重写
\u HAS\u CXX17
进行控制,如中所述。问题是,如果没有ovverides,
\u HAS_CXX17
是根据
yvals.h
中的编译器版本定义的(请参见问题),因此这可能会因Visual Studio的版本而异(因此,我无法给您一个明确的答案:什么组合将为您提供所需的结果,因为不清楚您是否要禁用/启用它,以及您的确切Visual Studio版本是什么)。正如文章中提到的,这有一个缺点,就是您可能会失去其他功能,因为它们没有对STL提供细粒度的控制。但是您可以尝试看看恢复到旧的STL行为是否会给您带来问题。

我可以通过另一位成员的建议来解决这个问题,以澄清ISO C++17标准(/std:C++17)在属性部分。现在我收到了缺少参数列表和无构造函数的错误,但至少它将作用域锁定识别为互斥类。您能否详细说明
作用域锁定的具体问题?