【问题标题】:Forcing function to be called as assignment operand only强制函数仅作为赋值操作数调用
【发布时间】:2015-04-06 12:57:41
【问题描述】:

是否可以这样声明一个函数

auto i = foo.GetLock();

有效,但是

foo.GetLock();

导致编译错误?

我的接口有一个返回 RIIA 风格锁对象的方法,我想确保没有人决定只调用 GetLock() 来锁定锁。

以前是这样的

class CSomethingOrElse : private CLockable
{
    ...
} foo;

CLocker<CSomethingOrElse> lock(foo);

但这对我来说太冗长了,我真的很想使用auto。

【问题讨论】:

  • 如果 getLock 返回一个类,该类在销毁时解锁:它不会如您所愿阻止非赋值调用,但会阻止锁定锁定
  • clang 和 gcc 对此有警告(使用函数的返回值)。 (见stackoverflow.com/questions/2870529/…)
  • @Jarod42 :但在这种情况下,您通常会收到大量警告,不是吗?很多函数都使用了可选的返回值(比如流操作符等)
  • @galinette:警告适用于属性,因此只有指定的函数会引发警告。

标签: c++


【解决方案1】:

foo.GetLock(); 是一个表达式语句,因此任何有效的表达式都可以以这种方式使用。你不能在编译时禁止它:你能得到的最好的就是警告。

假设您的对象在销毁时释放锁,那么不将结果存储在变量中的调用应该不是什么大问题,因为会立即获取并释放锁。

创建一个保护对象,类似于您在解决方案中描述的内容,是正确的方法。事实上,C++ 标准库的做法与 std::lock_guard 类似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多