我正在尝试修改一些先前存在的代码以使用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/