因此,我有一个管理资源的类。与相似std::mutex
,它具有acquire
和release
方法。为了成为一名优秀的RAII风格的程序员,我想对实现类似std::unique_lock
,以防止永远获取资源。但是,出于语义原因,acquire
并且release
是const
函数(请相信我)。
因此,这意味着我的RAII类的构造函数具有的签名RAIIType( const T &)
。问题是右值也将绑定到该值。我希望让SO的大脑能够阻止这种情况的发生。
用编码术语:
class ResourceType
{
public:
void acquire() const{}
void release() const{}
};
template< class T >
class RAIIClass
{
public:
RAIIClass(const T & in_t) : t(in_t) { t.acquire(); }
~RAIIClass() { t.release(); }
private:
const T & t;
};
ResourceType foo() { return ResourceType(); }
int main()
{
ResourceType x1;
const ResourceType & x2(x1);
{
RAIIClass<ResourceType> x(x1); //Allowable
}
{
RAIIClass<ResourceType> x(x2); //Allowable
}
{
RAIIClass<ResourceType> x(foo()); //Currently allowable, would like to disallow.
}
}
有任何想法吗?
添加此构造函数:
RAIIClass(const T&&) = delete;
这将绑定到const或非const右值,因为const和非const左值都将首选您现有的构造函数:
RAIIClass(const T & in_t) : t(in_t) { t.acquire(); }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句