use*_*200 4 c++ vector parameter-passing pass-by-value
来自Java背景我很困惑C++如何允许按值传递对象.关于何时通过值传递对象,我有一个概念上的疑问:
void add_to_vector(vector<SomeClass>& v, SomeClass var) {
v.push_back(var);
}
Run Code Online (Sandbox Code Playgroud)
这在概念上是否正确?这就是为什么我觉得这是错误的:var正在通过值传递,并且对象的内存将在函数调用的堆栈上分配.然后将其添加到矢量中.在函数调用结束时,堆栈将被清除,因此被引用的对象var也将被清除.因此,vector现在将包含一个在函数调用后不再存在的对象.
我错过了什么吗?
jua*_*nza 10
您缺少价值语义的强大概念.就像var是在功能的本地副本,std::vector被设计成后v.push_back(var);,v拥有副本的var.这意味着v可以使用元素而不必担心它们来自何处(除非SomeClass具有引用语义的成员,或者以某种方式或其他方式触及共享状态.)
是的,你缺少C++值语义.在Java中,向量仅包含对象引用,对象值本身驻留在堆上,并在不再使用时收集.在C++中,向量包含对象值,因此实际上,向量将保持其自己的私有值,而与函数的本地无关.即使你通过引用传递var,vector也会拥有自己的私有副本.将它们视为深层复制品.
push_back(std::move(var))如果您不打算在push_back之后使用该值,那么您可能希望在BTW中,当var在您的示例中按值传递时.