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

C++ 强制函数仅作为赋值操作数调用,c++,C++,是否可以以这样的方式声明函数 auto i = foo.GetLock(); 有效,但是 foo.GetLock(); 导致编译错误 我的接口有一个返回RIIA样式锁对象的方法,我想确保没有人决定只调用GetLock()来锁定锁 过去是这样的 class CSomethingOrElse : private CLockable { ... } foo; CLocker<CSomethingOrElse> lock(foo); class CSomethingOrEls

是否可以以这样的方式声明函数

auto i = foo.GetLock();
有效,但是

foo.GetLock();
导致编译错误

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

过去是这样的

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

CLocker<CSomethingOrElse> lock(foo);
class CSomethingOrElse:private CLockable
{
...
}傅;
时钟锁(foo);
但是对我来说太冗长了,我真的很想使用
auto

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

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


创建一个类似于您在解决方案中描述的保护对象是正确的方法。实际上,C++的标准库以类似的方式与.< /p>如果GETROCK返回一个类,它在销毁时打开:它不会阻止您希望的非赋值调用,但是它将阻止锁定的CalcLangand和GCC对此进行警告(使用函数返回的值)。(见)@Jarod42:但在这种情况下,你通常会收到大量警告,不是吗?许多函数使用可选的返回值(如流运算符等)。@galinette:警告与属性一起工作,因此只有指定的函数才会引发警告。