允许使用l值引用,不允许使用r值引用作为函数参数
Allow l-value references and disallow r-value references as a function parameter?
所以我有一个管理资源的类。与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和非常值都更喜欢您现有的构造函数:
RAIIClass(const T & in_t) : t(in_t) { t.acquire(); }
禁止为临时对象创建管理器的另一种选择是,当使用临时对象(在Coliru演示)调用时,更改管理器类以在内部存储托管对象:
template< class T >
class RAIIClass;
template <typename T>
RAIIClass<T> make_guard(T&&);
template< class T >
class RAIIClass
{
public:
~RAIIClass() { t.release(); }
private:
friend RAIIClass make_guard<>(T&&);
RAIIClass(T&& in_t) : t(std::forward<T>(in_t)) { t.acquire(); }
T t;
};
template <typename T>
RAIIClass<T> make_guard(T&& t) {
return {std::forward<T>(t)};
}
ResourceType foo() { return {}; }
int main()
{
ResourceType x1;
const ResourceType & x2(x1);
{
auto x = make_guard(x1); //Allowable
}
{
auto x = make_guard(x2); //Allowable
}
{
auto x = make_guard(foo()); //Allowable too.
}
}
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 具有常量引用参数的函数模板专用化
- C++:常量引用参数
- 字符串引用参数的效率C++
- 通过非常量引用参数修改常量引用参数
- 如何将指针变量作为引用参数传递?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 移动类的成员作为常量引用参数传递
- C++带有适用于左值和右值的引用参数的函数
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 委托构造函数和引用参数
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 如何强制函数仅接受左值引用参数
- 模板引用参数推断失败C++
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 将unique_ptr作为引用参数或常量传递unique_ptr引用