当这样在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::mutexstd::lock_guard。当我们尝试用方括号声明一个临时的WidgetGuard时,会出现错误。但是用括号括起来会编译。

实验1可以对此进行解释。编译器将WidgetGuard{ w1 }解析为“创建临时文件”。但是它将WidgetGuard(w1)解析为“声明变量w1”!错误有两种来源:重复使用相同的名称,并且WidgetGuard中没有默认构造函数。

实验0

返回std::mutexstd::lock_guard,让我们尝试大括号...
std::mutex m;
std::lock_guard<std::mutex> {m};

...而且有效。

可以创建std::lock_guard的临时目录。我们可以。

09-06 20:38