【问题标题】:C++ boost::shared_ptr operator[] detailsC++ boost::shared_ptr operator[] 详细信息
【发布时间】:2013-06-28 12:15:12
【问题描述】:

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

这种做法是不是违反了对象的恒常性?

【问题讨论】:

  • std::deque 不是数组
  • 这个boost::shared_ptr&lt;std::deque&lt;uint32_t&gt; &gt;只是一个指向双端队列的共享指针,它不是指向双端队列数组的共享指针。
  • 抱歉,这是一个字面错误。我的意思是相同的结构。我将编辑我的问题

标签: c++ boost shared-ptr


【解决方案1】:

这种做法是不是违反了对象的恒常性?

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

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

【讨论】:

  • 对不起,我不应该再问一个问题,从我的脑海中编写代码。当然,我的意思是 [] 和 std::deque 作为方法返回类型。我带着我的歉意。我将编辑我的问题。
  • @vard 好的,我从答案中删除了这些部分,希望我留下了回答您问题的内容。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2013-07-23
  • 2016-01-02
相关资源
最近更新 更多