gpt4 book ai didi

c++ - 如何在类成员互斥锁上使用 std::lock_guard

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

在下面的代码中,bad 方法编译失败,但是 good 方法没有。为什么提供对 this 的显式引用在这里有所不同?

#include <mutex>

class Foo
{
private:
std::mutex lock_;

public:
Foo() = default;
~Foo() = default;

void bad();
void good();
};

void Foo::bad()
{
std::lock_guard<std::mutex>(lock_);
}

void Foo::good()
{
std::lock_guard<std::mutex>(this->lock_);
}

int main()
{
return 0;
}

编译错误:

test.cpp: In member function ‘void Foo::bad()’:
test.cpp:18:36: error: no matching function for call to ‘std::lock_guard<std::mutex>::lock_guard()’
std::lock_guard<std::mutex>(lock_);

你可以玩ideone如果你愿意的话。

最佳答案

这是最令人烦恼的解析实例。这里的括号并不像您认为的那样。这:

std::lock_guard<std::mutex>(lock_);

相当于:

std::lock_guard<std::mutex> lock_;

这应该清楚说明您尝试执行的操作无法编译的原因,以及您遇到编译错误的原因。您需要做的是为 lock_guard 提供一个名称:

std::lock_guard<std::mutex> _(lock_);

好的版本是有效的,因为 this-> 资格阻止名称被视为标识符。


注意:lock_ 是一个 std::mutex 而不是任何一种锁,这使它成为一个非常容易混淆的名字。你应该给它起一个更能反射(reflect)它是什么的名字。像 mutex_

关于c++ - 如何在类成员互斥锁上使用 std::lock_guard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32850504/

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