当这样在C++中使用lock_guard时:
lock_guard<mutex>(lock);
编译器抱怨:
no matching constructor for initialization of 'std::lock_guard<std::mutex>'
因为正确的用法是:
lock_guard<mutex> guard(lock);
我想编写一个自定义的RAII分配器,这种分配器在发生这种情况时也会很简单-我尝试禁用复制构造函数和分配运算符,但到目前为止没有任何效果。
最佳答案
我不知道如何实现您的目标,但是我想我知道lock_guard<mutex>(lock)
发生了什么事。
让我们做一些实验。
实验1
int(x);
x = 1;
std::cout << x << std::endl;
实验表明,即使有一对括号,我们也声明了一个变量
x
。实验2
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
和std::lock_guard
,让我们尝试大括号...std::mutex m;
std::lock_guard<std::mutex> {m};
...而且有效。
可以创建
std::lock_guard
的临时目录。我们可以。