0

Boost文档说

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

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

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

我想有一种方法从数组中返回指定的双端队列以进行只读:

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

这种方法不违反对象的恒常性吗?

4

1 回答 1

3

这种方法不违反对象的恒常性吗?

不,是的。也许。它显然不会影响句法恒常性,因为编译器不会抱怨。这是因为句法恒常性要求对象及其成员,在这种情况下,尤其是智能指针,必须是 const。它不需要指针对象(即双端队列数组)为常量。语义恒常性是另一回事
。如果数组属于您的对象,则更改数组意味着更改对象,并且拥有对象 const 意味着不更改数组。您可以强制执行不是句法常量的语义常量。但是,在这种情况下,我不会使用 a而是 a ,因为这表示单一所有权,而共享所有权 - 显然。此外,shared_ptrstd::vectorshared_ptrstd::vector旨在强制语义恒定性,这意味着库实现者强制包含的元素在 const 向量中为 const。
但是,由于我不知道您的类和双端队列数组的上下文,并且由于您使用shared_ptrwich 明确表示共享所有权,因此您可能需要语义常量,也许不需要。

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

于 2013-07-01T11:39:39.523 回答