就我而言T
is pcl::PointCloud<pcl::PointXYZ>>
但问题应该代表任何类型T
。以下示例会产生错误:
using pc = pcl::PointCloud<pcl::PointXYZ> >;
boost::shared_ptr<pc> p(new pc);
boost::shared_ptr<const pc> const_p(new pc);
// This is legal
const_p = p;
// The atomic equivalent is not
boost::atomic_store(&const_p, p);
问题是boost::atomic_store
期望两个参数都是T*
and T
,但尽管事实上分配是完全安全的,但它们被认为是不同的类型p
to const_p
。下面的也不起作用。
boost::atomic_store(&const_p, const_cast<boost::shared_ptr<const pc> > (p));
尽管上面基本上铸造了pc*
to const pc*
这是完全安全的,它会产生一个关于const_cast
无法转换为不同类型。我明白是因为pc
是一个模板参数,它被认为是类型的一部分shared_ptr
而不是简历资格。接下来的工作
boost::atomic_store(&const_p, boost::shared_ptr<const pc>(p));
然而,它会产生额外的不必要的boost::shared_ptr
。据我了解,同样如此boost::const_pointer_cast<const pc>(p)
这是可以避免的,如果p
不再需要。
boost::atomic_store(&const_p, boost::shared_ptr<const pc>(std::move(p));
这仍然会创建一个额外的对象,但这并不重要,因为引用计数没有被修改,这是复制对象的昂贵部分shared_ptr
由于是原子的。
碰巧这发生在我的代码的非关键部分,所以我对上面的内容很好,但我想知道以供将来参考:如果std::move
不是一种选择,如何原子地存储boost::shared_ptr<T>
to a boost::shared_ptr<const T>
没有创建不必要的临时指针的开销?应该是可以的,因为查看是安全的T
通过一个const T*
,但我想不出办法。