是否有std :: lock_guard <std :: mutex> lock(m)的简写?

Bri*_*and 28 c++ c++11

究竟问题是什么.在C++中,理想情况下是11,但是对于14及更高版本也很好奇,有一个简写语法:

std::mutex someMutex;
std::lock_guard<std::mutex> lg(someMutex);
Run Code Online (Sandbox Code Playgroud)

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

换句话说,一种方法:

std::mutex someMutex;
std::lock_guard lg(someMutex);
Run Code Online (Sandbox Code Playgroud)

要么

auto lg = make_lock_guard(someMutex);
Run Code Online (Sandbox Code Playgroud)

对于现代C++的所有类型演绎功能,std::lock_guard<std::mutex>每次我想制作一个类型时,进行打字似乎都是多余的.

T.C*_*.C. 23

对于预C++ 17:

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

用于:

std::mutex someMutex;
auto&& lg = make_lock_guard(someMutex);
Run Code Online (Sandbox Code Playgroud)

这利用了复制列表初始化不会创建额外临时(甚至概念上)的事实.单参数构造函数是explicit并且不能用于复制列表初始化,因此我们首先锁定互斥锁,然后使用std::adopt_lock构造函数.

然后直接绑定返回值lg,将其生命周期延长到引用的生命周期,再次在流程中不创建临时(甚至概念上).

  • @Viktor Sehr.在C++ 17中,构造函数将能够推断出它们正在构造的类的类型.因此不需要这些make_foo函数. (2认同)
  • 很简单... - (2认同)

Dav*_*vid 18

除了@ TC的回答所暗示的,这里是C++ 17的方式:

auto lock = std::lock_guard(someMutex);
Run Code Online (Sandbox Code Playgroud)

您可以阅读此提案中的更改:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html


The*_*Kid 6

目前的两个答案都建议使用auto关键字来避免输入类型名称.这没有错,但我更喜欢我的代码包含typename,因此非常谨慎地使用auto关键字.我会提倡别名类型:

using MutexLockGuard = std::lock_guard<std::mutex>;
Run Code Online (Sandbox Code Playgroud)