C++ 冲突的声明标准::锁定保护<;std::mutex>;

C++ 冲突的声明标准::锁定保护<;std::mutex>;,c++,c++17,declaration,C++,C++17,Declaration,我不明白为什么下面的代码返回错误 #include <mutex> int main() { std::mutex mtx; std::lock_guard<std::mutex> (mtx); } #包括 int main(){ std::互斥mtx; 标准:锁紧装置(mtx); } lock.cpp:在函数“int main()”中: lock.cpp:5:37:错误:声明“std::lock_guardsd::mutex mtx”冲突 std:

我不明白为什么下面的代码返回错误

#include <mutex>

int main() {
    std::mutex mtx;
    std::lock_guard<std::mutex> (mtx);
}
#包括
int main(){
std::互斥mtx;
标准:锁紧装置(mtx);
}
lock.cpp:在函数“int main()”中:

lock.cpp:5:37:错误:声明“std::lock_guardsd::mutex mtx”冲突 std::lock_guardsd::mutex(mtx)

lock.cpp:4:16:注意:前面的声明为“std::mutex mtx” std::互斥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::锁紧护罩(此->mtx);
std::锁紧护罩(此->mtx);
}
私人:
std::互斥mtx;
};
但是,下面的代码不正确

int main() {
    std::lock_guard<std::mutex> (mtx);
    std::lock_guard<std::mutex> (mtx);
}
intmain(){
标准:锁紧装置(mtx);
标准:锁紧装置(mtx);
}

您声明了两次变量
mtx

std::mutex mtx;
std::lock_guard<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_;
};
类测试{
公众:
无效锁(){
std::锁紧护罩(此->mtx);
std::锁紧护罩(此->mtx);
}
私人:
std::互斥mtx;
};
然后这些记录

std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
std::lock\u guard(这个->mtx);
std::锁紧护罩(此->mtx);

这些不是声明。它们是使用数据成员的表达式(访问数据成员的表达式)
this->mtx
。这就是表达式
this->mtx\uuu
不是标识符。

您声明了变量
mtx
两次

std::mutex mtx;
std::lock_guard<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_;
};
类测试{
公众:
无效锁(){
std::锁紧护罩(此->mtx);
std::锁紧护罩(此->mtx);
}
私人:
std::互斥mtx;
};
然后这些记录

std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
std::lock\u guard(这个->mtx);
std::锁紧护罩(此->mtx);

这些不是声明。它们是使用数据成员的表达式(访问数据成员的表达式)
this->mtx
。这就是表达式
this->mtx\uu
不是标识符。

查找问题:

在第一个例子中:

std::mutex mtx;
std::lock_guard<std::mutex> (mtx);
您正在尝试使用语法
*type**identifier*(*构造函数参数*)
,并传递类中已存在的成员mtx,但没有变量名。因为缺少变量名,所以没有歧义,也没有错误。这只是匿名变量的声明

第三个例子肯定不好,因为您只是重复了ex.1中的错误两次,声明了两个名为
mtx
的变量

int main() {
    std::lock_guard<std::mutex> (mtx);
    std::lock_guard<std::mutex> (mtx);
}
intmain(){
标准:锁紧装置(mtx);
标准:锁紧装置(mtx);
}
如何解决:

正如我在评论中已经提到的,您最好为您的锁使用一个名称。要么是

std::lock_guard<std::mutex> lock(mtx);
std::锁和防护锁(mtx);
,或者如果你喜欢用括号来分散你的注意力

std::lock_guard<std::mutex>(lock)(mtx);
std::锁紧装置(锁)(mtx);

找出问题:

在第一个例子中:

std::mutex mtx;
std::lock_guard<std::mutex> (mtx);
您正在尝试使用语法
*type**identifier*(*构造函数参数*)
,并传递类中已存在的成员mtx,但没有变量名。因为缺少变量名,所以没有歧义,也没有错误。这只是匿名变量的声明

第三个例子肯定不好,因为您只是重复了ex.1中的错误两次,声明了两个名为
mtx
的变量

int main() {
    std::lock_guard<std::mutex> (mtx);
    std::lock_guard<std::mutex> (mtx);
}
intmain(){
标准:锁紧装置(mtx);
标准:锁紧装置(mtx);
}
如何解决:

正如我在评论中已经提到的,您最好为您的锁使用一个名称。要么是

std::lock_guard<std::mutex> lock(mtx);
std::锁和防护锁(mtx);
,或者如果你喜欢用括号来分散你的注意力

std::lock_guard<std::mutex>(lock)(mtx);
std::锁紧装置(锁)(mtx);

Try
std::lock\u guard lock(mtx)
@NikitaSmirnov假设他正在尝试
锁定
(我认为他是:))对更新的问题的评论:因为在使用
std::lock_-guard(这个->mtx)的情况下
您只需创建两个不同的未命名实例
std::lock\u guard
Try
std::lock\u guard lock(mtx)
@NikitaSmirnov假设他正在尝试
锁定
(我认为他是:))对更新的问题的评论:因为在使用
std::lock_-guard(这个->mtx)的情况下
只需创建两个不同的未命名实例
std::lock\u-guard
但code
std::lock\u-guard(this->mtx);std::锁紧护罩(此->mtx)是ok@Pengcheng这些不是声明。也就是说->mtx不是一个标识符。这些都是表达式。它是“最烦人的解析”的一个实例吗?@Ruslan它的意思只是声明符可以用括号括起来。例如,您可以声明一个二维数组,如int(((a)[M])[N]);虽然编译器可以发出一条括号是redundent的消息,我的意思是,
std::lock\u guard(mtx)看起来像一个函数(构造函数(立即销毁))调用,但实际上是一个声明;std::锁紧护罩(此->mtx)是ok@Pengcheng这些不是声明。也就是说->mtx不是一个标识符。这些都是表达式。它是“最烦人的解析”的一个实例吗?@Ruslan它的意思只是声明符可以用括号括起来。例如,您可以声明一个二维数组,如int(((a)[M])[N]);虽然编译器可以发出一条括号是redundent的消息,我的意思是,
std::lock\u guard(mtx)
看起来像一个函数(构造函数(立即销毁))调用,但实际上是一个声明。