<分区>
为什么push_back
的函数签名如下?
void push_back (const value_type& val);
传递的值被复制到容器中,为什么不直接复制到参数列表中呢?
void push_back (value_type val);
<分区>
为什么push_back
的函数签名如下?
void push_back (const value_type& val);
传递的值被复制到容器中,为什么不直接复制到参数列表中呢?
void push_back (value_type val);
最佳答案
答案是避免制作另一个拷贝。看看这个简单的例子,它说明了使用 value_type
和 const value_type&
之间的区别。
#include <iostream>
using namespace std;
struct A
{
A() {}
A(A const& copy)
{
cout << "Came to A::A(A const& copy)\n";
}
void print() const
{
cout << "Came to A:print()\n";
}
};
void foo(A const& a)
{
A copy = a;
copy.print();
}
void bar(A a)
{
A copy = a;
copy.print();
}
int main()
{
A a;
foo(a);
bar(a);
}
运行程序的输出:
Came to A::A(A const& copy) Came to A:print() Came to A::A(A const& copy) Came to A::A(A const& copy) Came to A:print()
请注意由于调用 bar
而对复制构造函数的额外调用。对于某些对象,当操作执行数百万次时,额外的复制构造和相应的销毁可能会非常昂贵。
关于c++ - 为什么 push_back 签名是 void push_back (const value_type& val) 而不是 void push_back (value_type val)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799174/