push_back 即使在定义中另有说明,也要为临时对象复制对象?
push_back copy objects even for temps although stating otherwise in it's definition?
其中一个 push_back 定义是
push_back(const value_type& __x)
所以 my_vector2.push_back( obj );
将导致通过引用传递对象 obj(在传递对象期间没有复制)它仍然在某处调用 push_back 主体中的复制构造函数所以为什么不直接传递它值即;
push_back(const value_type __x)
并通过阅读函数原型使其行为易于理解。我不知道复制省略是否会介入,因为它应该只用于 return 值,而构造函数不会 return 任何东西。在任何情况下,在以任何方式将对象传递给函数或方法的过程中,复制省略都会介入,或者它是否仅适用于 return 值。我的意思是省略按值传递给函数(push_back)或其他任何对象的副本,因此我们必须在 push_back?
的主体中制作副本
第二个更令人困惑的是,它还获取了一个临时对象的副本,并且与上面的行为相同,它通过右值引用获取它 push_back(value_type&& __x)
所以为什么要获取一个已经是临时对象的副本。我的意思是我不需要它(它是一个临时工)我知道这里有一点遗漏但它是什么。
push_back
早于移动语义,所以 std::vector
能做的最好的事情就是复制。虽然 C++11 可能会改变它,但这也是行为的改变,在某些情况下可能会破坏代码(奇怪的情况,但仍然有效)。
如果你想在处理临时对象时避免复制,那么你实际上需要 emplace_back
,这正是你所描述的。它将在 vector
的存储中就地构造对象,因此如果传递临时对象,您的开销是移动 ctor。
其中一个 push_back 定义是
push_back(const value_type& __x)
所以 my_vector2.push_back( obj );
将导致通过引用传递对象 obj(在传递对象期间没有复制)它仍然在某处调用 push_back 主体中的复制构造函数所以为什么不直接传递它值即;
push_back(const value_type __x)
并通过阅读函数原型使其行为易于理解。我不知道复制省略是否会介入,因为它应该只用于 return 值,而构造函数不会 return 任何东西。在任何情况下,在以任何方式将对象传递给函数或方法的过程中,复制省略都会介入,或者它是否仅适用于 return 值。我的意思是省略按值传递给函数(push_back)或其他任何对象的副本,因此我们必须在 push_back?
的主体中制作副本第二个更令人困惑的是,它还获取了一个临时对象的副本,并且与上面的行为相同,它通过右值引用获取它 push_back(value_type&& __x)
所以为什么要获取一个已经是临时对象的副本。我的意思是我不需要它(它是一个临时工)我知道这里有一点遗漏但它是什么。
push_back
早于移动语义,所以 std::vector
能做的最好的事情就是复制。虽然 C++11 可能会改变它,但这也是行为的改变,在某些情况下可能会破坏代码(奇怪的情况,但仍然有效)。
如果你想在处理临时对象时避免复制,那么你实际上需要 emplace_back
,这正是你所描述的。它将在 vector
的存储中就地构造对象,因此如果传递临时对象,您的开销是移动 ctor。