【发布时间】:2013-04-24 10:34:15
【问题描述】:
我有一个ScopedLock 类,它可以帮助在超出范围时自动释放锁定。
但是,问题是:有时团队成员会编写无效的锁定代码,例如
{
ScopedLock(mutex); // anonymous
xxx;
}
上面的代码是错误的,因为ScopedLock对象是立即被构造和销毁的,所以它未能锁定预期的区域(xxx)。我希望编译器在尝试编译此类代码时给出错误。这个可以吗?
我搜索了g++ 警告选项,但没有找到正确的选项。
【问题讨论】:
-
我不认为你可以禁止这个(甚至生成编译器诊断)。一个更有效(并且可能更令人满意)的解决方案是在你的同事这样做时打他们一巴掌,直到他们最终停止这样做。 ;)
-
顺便说一句,实际名称是临时对象而不是匿名对象。
-
不幸的是,lists.cs.uiuc.edu/pipermail/cfe-dev/2010-December/012755.html 似乎从未进入 Clang。
-
当然,
ScopedLock(mutex), foo();是有效的用法。单独来看它从来没有必要,但在更复杂的表达式中它可以非常方便:Bar(2, (ScopedLock(mutex), foo()), 3). -
P0577 建议通过重新利用
register关键字来表示“将以下匿名对象与整个范围相关联”来避免这种情况。