在下面的代码中,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/