C ++ boost :: shared_ptr operator []详细信息

时间:2013-07-01 11:28:03

标签: c++ boost shared-ptr

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];
}

这种做法是否违反了对象的恒定性?

1 个答案:

答案 0 :(得分:3)

  

这种做法是否违反了对象的恒定性?

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

但是,因为您说您想要一个只读访问权限并按值返回,该访问权限不会改变数组内容,您可能会很好。通过const引用返回也可能会执行您需要的操作,并且它可以避免不必要的临时副本,这可能会非常昂贵,具体取决于dequeues存储的对象数量