gpt4 book ai didi

c++ - 通过编译错误 C++ 在 RAII 中强制非临时

转载 作者:太空狗 更新时间:2023-10-29 21:18:52 24 4
gpt4 key购买 nike

当像这样在 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) 发生了什么.

让我们做一些实验。

实验一

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::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可以创建。我们就是可以。

关于c++ - 通过编译错误 C++ 在 RAII 中强制非临时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29001423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com