C++11 将此std::shared_ptr作为函数参数传递的首选方式是什么?

C++11 将此std::shared_ptr作为函数参数传递的首选方式是什么?,c++11,C++11,我有一个关于std::shared\u ptr的非常基本的问题。如果我有 std::shared_ptr<A> p; 并将*p传递给这些函数,然后根据需要将'a'转换回std::shared_ptr?有这样做的理由吗?通常的做法是什么?或者我应该将shared_ptr作为参数传递如下: void func(A &a); void func(std::shared_ptr<A> p); //thread safe void func(const std::sha

我有一个关于std::shared\u ptr的非常基本的问题。如果我有

std::shared_ptr<A> p;
并将*p传递给这些函数,然后根据需要将'a'转换回std::shared_ptr?有这样做的理由吗?通常的做法是什么?或者我应该将shared_ptr作为参数传递如下:

void func(A &a);
void func(std::shared_ptr<A> p); //thread safe
void func(const std::shared_ptr<A> & p); //not thread safe
void func(std::shared_ptr p)//线程安全
无效函数(常数标准::共享\u ptr&p)//线程不安全

在我的项目中的大多数函数中,我可以同时使用两个选项,但我的同事说第一个选项更好,因为引用(A&)总是比指针(shared_ptr或A*)更好,因为引用语义意味着参数不是空的。

如果您已经有一个共享指针,不通过
shared\u ptr
,而通过
shared\u从此
创建一个新的ptr是没有意义的。这很复杂,不会给你带来任何好处

通常的建议是,如果函数需要创建副本(例如存储对象),则按值传递对象;如果函数只需要“查看”对象,则按常量引用传递对象

这也适用于共享指针

因此,例如

// Here func in the end needs a copy of the shared_ptr, so pass by value
// the caller can decide whether he wants to move or a copy it in
struct Example {
  shared_ptr<A> m_a;
  void func (shared_ptr<A> a) {
     m_a = move (a);
  }
};

// Here func needs only a reference, so only pass a reference
void func (shared_ptr<A> const & a) {
   a->callme ();
}

// If func needs to see only an object of type A, i.e. does not
// need a pointer, it makes
// more sense to pass an A & or A const &
void func (A const & a) {
   a.callme ();
}
//这里func最终需要一个共享\u ptr的副本,所以按值传递
//打电话的人可以决定是移动还是复制
结构示例{
共享的ptr m_a;
无效函数(共享){
m_a=移动(a);
}
};
//这里func只需要一个引用,所以只传递一个引用
无效函数(共享\u ptr const&a){
a->callme();
}
//如果func只需要查看类型为A的对象,即不需要
//需要一个指针,它使
//传递A&或const更有意义&
无效函数(常数和A){
a、 callme();
}

我无法想象通过引用传递共享的_ptr将意味着通过传递值可以避免的线程安全问题。当然,您应该避免在不在任何地方保存共享指针副本的线程中保存对共享指针的引用。但是,只要线程有一个共享指针的副本,您就可以在该线程内自由传递对该共享指针的引用。

可能的重复不是完全重复,因为这并不能真正解决第一个选项(通过引用传递指针对象),但肯定包含一些适当的想法。您确定,您没有混合使用“A const”和“const A”?
A const
const A
是相同的。