问题的确切含义。在C++中,理想情况下为11,但也对14及更高版本感到好奇,是否存在以下简化语法:

std::mutex someMutex;
std::lock_guard<std::mutex> lg(someMutex);

理想情况下,如果我想更改为std::recursive_mutex,则可以推断出互斥锁的类型以避免重构。

换句话说,一种执行此操作的方法:
std::mutex someMutex;
std::lock_guard lg(someMutex);

要么
auto lg = make_lock_guard(someMutex);

对于现代C++的所有类型推导功能,每次我想编写一个std::lock_guard<std::mutex>时,似乎都非常多余。

最佳答案

对于C++ 17之前的版本:

template<class Mutex>
std::lock_guard<Mutex> make_lock_guard(Mutex& mutex) {
    mutex.lock();
    return { mutex, std::adopt_lock };
}

用于:
std::mutex someMutex;
auto&& lg = make_lock_guard(someMutex);

这利用了以下事实:复制列表初始化不会创建其他临时文件(即使在概念上也是如此)。单参数构造函数是explicit,不能用于复制列表初始化,因此我们先锁定互斥锁,然后再使用std::adopt_lock构造函数。

然后,将返回值直接绑定(bind)到lg,它将其生存期延长到引用的生存期,再次在此过程中不创建任何临时(甚至在概念上)。

关于c++ - std::lock_guard <std::mutex> lock(m)是否有简写形式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38836090/

10-11 22:33
查看更多