gpt4 book ai didi

C++/boost::scoped_lock:缺少编译器警告

转载 作者:行者123 更新时间:2023-11-30 02:37:25 27 4
gpt4 key购买 nike

我想知道是否可以配置 C++ 编译器,以便在有人实例化 scoped_lock 但忘记将其分配给变量时发出警告。

请看下面的例子:

  • 案例 1.1 和案例 2.1 显示了 scoped_lock 的预期用途
  • 案例 1.2 是错误的使用,其中没有创建 holder 变量。它被编译器正确检测为错误(mMutex 有一个先前的声明)
  • 案例 2.2 与案例 1.2 几乎是相同的错误,但是编译器没有检测到也没有发出任何警告,尽管代码显然有错误,并且非常接近案例 1.2(当然互斥锁将不起作用).

看下面的代码,我用g++-4.8和visual studio 2010测试过,都没有检测到2.2的错误情况。

有谁知道 case 2.2 编译的原因,以及如何让编译器将其检测为警告?

#include  <boost/thread/recursive_mutex.hpp>
void Mutex1()
{
boost::recursive_mutex mMutex;

//Case 1.1 : correct mutex creation
boost::recursive_mutex::scoped_lock lock(mMutex);

//Case 1.2 : incorrect mutex creation
//==> leads to a compile error : "mMutex has a previous declaration" : perfect
boost::recursive_mutex::scoped_lock(mMutex);
}

class FooMutex
{
boost::recursive_mutex mMutex;
void TestMutex()
{
//Case 2.1 : correct mutex creation
boost::recursive_mutex::scoped_lock lock(mMutex);//compiles correctly => ok

//Case 2.2 : incorrect mutex creation
//is compiled without warning ! Ouch !!!
boost::recursive_mutex::scoped_lock(mMutex);
}
};

最佳答案

这一行:

boost::recursive_mutex::scoped_lock(mMutex);

相当于这一行:

boost::recursive_mutex::scoped_lock mMutex;

因此,编译器警告或错误是什么?在第一种情况下,这是一个错误,因为您试图重新声明 mMutex,但在第二种情况下,它是完全合理的代码,因为 scoped_lock 是可默认构造的。只有你的函数中的特定逻辑是错误的。编译器无法读懂你的想法。

如果你想简单地防止 scoped_lock 被默认构造,你可以自己做一个不是:

template <typename T>
struct my_unique_lock : boost::unique_lock<T> {
using boost::unique_lock<T>::unique_lock;

my_unique_lock() = delete;
};

struct my_recursive_mutex : boost::recursive_mutex {
using scoped_lock = my_unique_lock<my_recursive_mutex>;
};

这样,

my_recursive_mutex mMutex;
{
my_recursive_mutex::scoped_lock(mMutex);
}

不会编译,因为默认构造函数是deleted。

关于C++/boost::scoped_lock:缺少编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31592016/

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