Missing shared_ref
Missing shared_ref
在与std::shared_ptr
一起工作时,我有点错过了shared_ref
实现。这是shared_ptr
的专业化,它保证了它永远不会包装nullptr
(当然,前提是正确的用法)。我有点想知道为什么它不在 C++11 标准中。实施时有市长问题吗?在我的头顶上,我想不出任何东西。
编辑:
我希望有一个类似于以下内容的界面:
template <typename T>
class shared_ref {
public:
shared_ref( T&& ref );
T& get();
T* operator&() const;
template< class Y >
void reset( Y&& obj );
long use_count() const;
bool unique() const;
void swap( shared_ref& r );
};
实施时有市长问题吗?
这里有一个:你不能拥有参考的所有权。智能指针的全部意义在于声明指针本身的所有权。 shared_ref
无法工作,因为您无法控制引用的生存期。
不,这也不会飞:
shared_ref( T&& ref ) : p(&ref) {}
用户可能已经为您提供了一个堆栈变量,这意味着您在此对象和堆栈变量之间拥有"共享"所有权。堆栈变量不能与某些东西共享所有权。
您只能控制指针的生存期。指针可以为 NULL。因此,您唯一能做的就是运行时检查指针是否为 NULL。
你能做的绝对最好的事情是等效于shared_ptr
的接口,除了它没有默认构造函数并在给定 NULL 时抛出。这真的值得创建一个全新的指针类型吗?
C++核心指南支持库具有not_null
模板,该模板可应用于大多数类似指针的类型。因此,当您想要验证指针是否为 NULL 时,可以使用 not_null<shared_ptr>
,但只能在它进入使用时使用一次。初始创建指针后,无需再次检查。
当然,你不能强迫其他人使用它们,但始终如一地使用该类型将解决问题。
shared_ptr
只有两种方式为 null - 要么是默认构造的,要么是在某些时候被分配了一个 null 值。由于您已经同意默认构造假设的shared_ref
类是没有意义的,因此只剩下第二个条件。
如果您尝试为shared_ref
对象分配nullptr
,您希望发生什么?它应该抛出错误吗?使用简单的模板函数对常规shared_ptr
执行相同的操作是微不足道的:
template<typename T>
T* notnull(T* ptr)
{
if (ptr == std::nullptr)
throw std::invalid_argument(std::string("nullptr"));
return ptr;
}
std::shared_ptr<int> pint = notnull(GetIntPtr());
通常,除非有迫切的需求并且没有简单的解决方法,否则不会将事情添加到标准中。
- 对RValue对象调用的LValue ref限定成员函数
- 将Ref对象作为类成员
- 为什么我的 std::ref 无法按预期工作?
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何@ref同一方法的不同变体?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 引用 std::shared:ptr 以避免引用计数
- 为什么要用 ref-qualifier 和
- 将 ArrayXd 传递给 const VectorXd& 和 const Ref<const VectorXd>&
- 返回 Eigen::Ref 合法吗?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 在与Odint组合的类中使用特征矩阵Ref
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- 正在通过const-ref未定义的行为捕获新构造的对象
- 无法使用 libtool 将 -shared 参数传递给 g++