我正在尝试修改一些先前存在的代码以使用std :: shared_ptr 。这是一个“消息传递系统”,因此基本上下文是:

公开方法:

void writeReport(std::shared_ptr<const ReportBase> pReport) {
  /* This is a public method for writing a report. I might do
     additional stuff in here but end by forwarding to the
     private method. */
  writeReport_(pReport);
}


私人方法:

void writeReport_(std::shared_ptr<const ReportBase> pReport) {
  if( certain conditions )
    processReport_(pReport);

  writeBytes_(serialize(pReport));
}


加工方式:

void processReport_(std::shared_ptr<const ReportBase> pReport) {
  processReportImpl(pReport);

  if( certain other conditions )
    reportDeque_.push_back(pReport);
}


例如,在上述伪代码中,processReport _(...)可能是在某些条件下想要实际存储记录的唯一方法。其他方法只是对所指向对象的内容感兴趣。因此,如果不是有时需要在processReport_(...)中复制shared_ptr(即“存储”记录),我只需将const ReportBase *传递给所有嵌套函数,并避免传递值的开销(即使用计数增量)。

因此,我想传递std::shared_ptr<const ReportBase>&(可能在适当的地方也许&&),但要阻止某些恶意嵌套方法实际修改指针指向的内容。所以我想我想通过const std::shared_ptr<const ReportBase>&来防止这种情况...

...但是,再次,在processReport_(...)中,我有时会想要复制一份以存储记录。

最终使我想到了问题...


使用计数对std :: shared_ptr可变吗?
为什么我可以(或不能)在const std::shared_ptr<...>上将副本分配给std::shared_ptr<...>
const是否使shared_ptr const的整个控制块?还是前导const仅适用于原始指针值?


而且,如果有人想切切地回答“不必太担心将值传递给嵌套函数”或“我对您有完全不同的方法”,那么我也很想听听。

最佳答案

std::shared_ptr存储指向控制块的指针,该指针在堆上分配。毕竟,它必须在该shared_ptr的所有副本之间共享。因此,将const应用于std::shared_ptr时,仅是使该指针const。指向的控制块对象保持为非常量。考虑ControlBlock* const。因此,尽管逻辑上控制块确实是可变的,但在那里不需要显式的mutable关键字。

关于c++ - 使用计数对const std::shared_ptr <...>可变吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44830481/

10-11 22:28
查看更多