强制函数仅作为赋值操作数调用

时间:2015-04-06 12:57:42

标签: c++

是否可以以

的方式声明一个函数
auto i = foo.GetLock();

有效,但

foo.GetLock();

导致编译错误?

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

曾经是这样的

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

CLocker<CSomethingOrElse> lock(foo);

但是我的口味太过冗长,我真的很想使用auto

1 个答案:

答案 0 :(得分:1)

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

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

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