joa*_*dre 3 c++ smart-pointers parameter-passing
考虑以下类别:
class A {
public:
A() {};
protected:
int m1;
float m2;
// ...
}
class B {
public:
B() { };
void add1(std::shared_ptr<A> _obj) {
data.push_back(_obj);
};
void add2(A* _obj) {
data.push_back(_obj);
};
void add3(A& _obj) {
data.push_back(&_obj);
};
private:
std::vector<std::shared_ptr<A>> data;
}
Run Code Online (Sandbox Code Playgroud)
将addX
类中B
的新方法传递给矢量时,该类中的哪种方法更适合/最佳实践?考虑到这data
是非const智能指针的向量,我理解不可能通过const引用传递对象或智能指针,而不必“去const”它们,这是不可取的,并且被认为是不好的做法。但是,除非我弄错了,否则所有这些方法最终都会实例化a shared_ptr
,然后将其复制到向量中?它们之间有什么区别?
如果您想确保您的API明确表明被调用者将要拥有所有权,则唯一可行的方法是add1
。从签名中可以清楚地看出,您提供的任何内容都将由被叫方保留。
您可以使用std::move
和改进它.emplace_back
:
void add1(std::shared_ptr<A> _obj)
{
data.emplace_back(std::move(_obj));
}
Run Code Online (Sandbox Code Playgroud)
add2
具有误导性,因为原始指针可能或可能不暗示所有权。有人可以将指针传递给堆栈分配的变量。
add3
虽然存在相同的问题,但是由于非const
引用通常用于原地更改对象而不是获取其所有权,因此它甚至具有更大的误导性。