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];
}
这种做法是否违反了对象的恒定性?
答案 0 :(得分:3)
这种做法是否违反了对象的恒定性?
没有。是。也许。
它显然不会影响语法常量,因为编译器不会抱怨。这是因为语法常量要求对象及其成员(在本例中尤其是智能指针)为const。它不要求指针(即deques数组)为const
语义常量是另一回事。如果数组属于您的对象,则更改数组意味着更改对象,并且使用对象const意味着不更改数组。由你来强制执行不是语法常量的语义常量。但是,在这种情况下,我不会使用shared_ptr
而是使用std::vector
,因为它表示单一所有权,而shared_ptr
是共享所有权 - 显然。此外,std::vector
旨在强制执行语义持久性,这意味着库实现者将包含的元素强制为const向量中的const。
但是,由于我不知道你的类和deque数组的上下文,并且因为你使用shared_ptr
明确意味着共享所有权,也许你需要语义常量,也许不是。< / p>
但是,因为您说您想要一个只读访问权限并按值返回,该访问权限不会改变数组内容,您可能会很好。通过const引用返回也可能会执行您需要的操作,并且它可以避免不必要的临时副本,这可能会非常昂贵,具体取决于dequeues存储的对象数量