是否可以以
的方式声明一个函数auto i = foo.GetLock();
有效,但
foo.GetLock();
导致编译错误?
我的界面有一个方法返回RIIA风格的锁对象,我想确保没有人决定只是调用GetLock()来锁定锁。
曾经是这样的
class CSomethingOrElse : private CLockable
{
...
} foo;
CLocker<CSomethingOrElse> lock(foo);
但是我的口味太过冗长,我真的很想使用auto
。
答案 0 :(得分:1)
foo.GetLock();
是表达式语句,因此可以以这种方式使用任何有效表达式。你不能在编译时禁止这样做:你能得到的最好的是一个警告。
假设您的对象在销毁时释放锁定,那么不将结果存储在变量中的调用不应该是一个大问题,因为锁定将被立即获取并释放。
创建保护对象,类似于您在解决方案中描述的内容,是正确的方法。事实上,C ++标准库以与std::lock_guard
类似的方式实现它。