我不知道如何实现你的目标,但我想我知道发生了什么事lock_guard<mutex>(lock)
。
让我们做一些实验。
实验一
int(x);
x = 1;
std::cout << x << std::endl;
实验表明我们已经声明了一个变量x
,即使有一对括号。
实验二
class Widget
{
};
class WidgetGuard
{
private:
Widget& widget;
public:
WidgetGuard(Widget& w)
: widget(w)
{}
};
int main()
{
Widget w1;
WidgetGuard wg1(w1);
WidgetGuard(w1); //Error!
WidgetGuard{ w1 }; //Pass!
}
我们定义了一个Widget
类和WidgetGuard
类来模拟std::mutex
和std::lock_guard
。当我们尝试WidgetGuard
用方括号声明一个临时变量时,它会报错。但是用大括号编译。
这可以用实验 1 来解释。编译器解析WidgetGuard{ w1 }
为“创建临时”。但它解析WidgetGuard(w1)
为“声明变量w1
”!有两个错误来源:重用相同的名称,以及在WidgetGuard
.
实验 0
回到std::mutex
and std::lock_guard
,让我们试试大括号...
std::mutex m;
std::lock_guard<std::mutex> {m};
...它的工作原理。
std::lock_guard
可以创建一个临时的。我们只是可以。