我不明白为什么下面的代码会返回错误。
#include <mutex>
int main() {
std::mutex mtx;
std::lock_guard<std::mutex> (mtx);
}
lock.cpp:在函数"int main(("中:
lock.cpp:5:37:错误:冲突声明"std::lock_guardstd::mutex mtx"std::lock_guardstd::互斥(mtx(;
lock.cpp:4:16:注意:以前声明为"std::mutex mtx"std::mutex mtx;
但是,以下代码编译正确。
class Test {
public:
void lock() {
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
}
private:
std::mutex mtx_;
};
但是,下面的代码不好。
int main() {
std::lock_guard<std::mutex> (mtx);
std::lock_guard<std::mutex> (mtx);
}
您将变量mtx
声明了两次
std::mutex mtx;
std::lock_guard<std::mutex> (mtx);
第一个声明可以像一样等效地重写
std::mutex ( mtx );
std::lock_guard<std::mutex> (mtx);
或者第二个声明可以像一样重写
std::mutex mtx;
std::lock_guard<std::mutex> mtx;
也就是说,您可以将声明符括在括号中。
因此,标识符CCD_ 2以不同的类型被声明两次。
您似乎忘记在第二个声明中指定标识符。:(类似的东西
std::lock_guard<std::mutex> my_lock( mtx );
编辑:使用新的代码片段更新问题后
class Test {
public:
void lock() {
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
}
private:
std::mutex mtx_;
};
然后这些记录
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
不是声明。它们是使用数据成员(访问数据成员的表达式(this->mtx_
的表达式。也就是说,表达式this->mtx_
不是标识符。
找出问题:
在第一个例子中:
std::mutex mtx;
std::lock_guard<std::mutex> (mtx);
在这里,您已经声明了一个类型为std::mutex
的变量mtx
。下一行不明确。它可以被视为声明std::lock_guard<std::mutex>
类型变量的表达式,但由于您没有将参数传递给lock_guard构造函数,因此它被视为语法为*type* (*identifier*)
的纯声明。你可以在这里找到更多关于解决歧义的信息。
在第二个例子中:
void lock() {
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
}
您正在尝试使用语法*type* *identifier* (*constructor arguments*)
,并传递类中已经存在的成员mtx_,但没有变量名。不存在由于缺少变量名而导致的歧义和错误。它只是匿名变量的声明。
第三个例子肯定不好,因为您只是重复了前1中的错误两次,声明了两个名为mtx
的变量。
int main() {
std::lock_guard<std::mutex> (mtx);
std::lock_guard<std::mutex> (mtx);
}
如何解决:
正如我在评论中已经提到的,你最好为你的锁使用一个名字。要么是
std::lock_guard<std::mutex> lock(mtx);
,或者如果喜欢使用括号来分散注意力
std::lock_guard<std::mutex>(lock)(mtx);