C++boost::shared_ptr运算符[]详细信息

C++ boost::shared_ptr operator[] details

本文关键字:详细信息 运算符 ptr shared C++boost      更新时间:2023-10-16

Boost文档显示

从Boost 1.53版本开始,shared_ptr可以用于保存指向动态分配的数组的指针。

我有一个简单的类,使用boost::shared_ptr在其中保存std::deque的数组:

boost::shared_ptr<std::deque<uint32_t> []> someArray;

我想有一个方法从数组中返回指定的deque以只读:

std::deque<uint32_t> MyClass::myMethod(boost::uint32_t arrayIndex) const{            
        return someArray[arrayIndex];
}

这种方法是否违反了物体的恒定性?

这种方法是否违反了物体的恒定性?

没有。对大概它显然不会影响语法的恒定性,因为编译器不会抱怨。这是因为语法恒定性要求对象及其成员,在这种情况下,尤其是智能指针,是常量。它不要求指针对象(即deques数组)为常量
语义恒定性是另一回事。如果数组属于您的对象,则更改数组意味着更改对象,而对象常量意味着不更改数组。这取决于你强制执行语义上的constness,而不是句法上的constess。然而,在这种情况下,我不会使用shared_ptr,而是使用std::vector,因为这表示单一所有权,而shared_ptr显然是共享所有权。此外,std::vector被设计为强制语义恒定性,这意味着库实现者强制所包含的元素在const向量中为const
然而,由于我不知道您的类和deque数组的上下文,并且由于您使用明确表示共享所有权的shared_ptr可能您需要语义常量,也许不需要。

但是由于您说过您想要只读访问,并且您按值返回,因此该访问不会更改数组内容,因此您可能会满意。通过const引用返回也可以满足您的需要,此外,它还可以避免不必要的临时副本,这些副本可能非常昂贵,具体取决于出队列存储的对象数量