我有一个包含class A
类型元素的向量。类A
具有明确定义的复制构造函数,但复制运算符已设为私有且未定义(不打算使用)。如果我将新元素插入到矢量中,如下所示
A walker; //This calls the default constructor.
std::vector< A > vec;
std::vector< A >::iterator it = vec.begin();
vec.insert( it, walker ); //Shouldn't this call the copy constructor?
我收到错误,抱怨复制操作符是私有的。但是不应该使用复制构造函数吗?
答案 0 :(得分:4)
vector
确实使用了插入元素的复制构造函数。但是vector
仍然需要内部的赋值运算符,在vector
类型的可重新赋值范围内是可分配的。我相信C ++ 11现在只需要移动赋值。
答案 1 :(得分:0)
在 msvc 或 gcc 中,Vector.insert() 在内部调用 emplace() 函数。
首先,如果向量的容量与向量的大小相等,则以两倍的容量重新分配向量。首先插入/移动对象(调用移动构造函数),然后在新分配的位置复制现有对象存储(复制构造函数被调用)。
如果在插入调用之前vector的容量大于size,现在如果最后没有完成插入,首先插入/移动对象(调用移动构造函数)并且现有的对象只是在同一个存储中分配(赋值复制被称为运算符)
#include <iostream>
#include<vector>
using namespace std;
class A
{
public:
int i;
A() = default;
A(int k) :i(k) { cout << "init"; };
A(const A&&)
{
{cout << "move"; };
}
A(const A&)
{
{cout << "copy"; };
}
A& operator=(const A&)
{
std::cout << endl << "assignment" << endl;
return *this;
}
};
int main()
{
// vector<int> vi(5); // just to show that std::vector always default initializes values & hence int will be 0 here
// A a(2);
// A a= 2;
vector<A> va(4); // ---> calls default
cout << "------" << va.capacity() << "-";
va.emplace_back(2);
cout << "------"<<va.capacity()<<"-"<<va.size()<<"--";
va.push_back(2);
va.insert(va.begin(), 4);
return 0;
}
------2- init 移动复制 复制 ------4-3-- 启动 分配
分配 移动 分配