C++ vector.insert(…)调用构造函数还是赋值运算符?
我有一个向量,元素类型为C++ vector.insert(…)调用构造函数还是赋值运算符?,c++,vector,constructor,C++,Vector,Constructor,我有一个向量,元素类型为a类。类A有一个显式定义的复制构造函数,但复制运算符已被设置为私有且未定义(不打算使用它)。如果我像下面那样在向量中插入新元素 A walker; //This calls the default constructor. std::vector< A > vec; std::vector< A >::iterator it = vec.begin(); vec.insert( it, walker );
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?
步行者//这将调用默认构造函数。
std::vectorvec;
std::vector::迭代器it=vec.begin();
向量插入(it,walker)//这不应该调用复制构造函数吗?
我收到一个错误,抱怨复印操作员是私人的。但是vector不应该使用复制构造函数吗?
vector确实在为插入的元素使用复制构造函数。但是vector
在内部仍然需要赋值运算符,在vector
类型可赋值的要求范围内。我相信C++11现在只需要移动赋值。在msvc或gcc中,Vector.insert()在内部调用emplace()函数
首先,如果向量的容量等于向量的大小,则向量将以两倍增加的容量重新分配。首先插入/移动对象(移动构造函数称为),并在新分配的存储中复制现有对象(复制构造函数称为)
如果向量的容量大于插入调用之前的大小,那么现在如果最后没有完成nsertion,则首先插入/移动对象(调用移动构造函数),并且只在同一个存储中分配现有对象(assignment copy is operator调用)
#包括
#包括
使用名称空间std;
甲级
{
公众:
int i;
A()=默认值;
A(int k):i(k){确实可以。它需要移动或“经典”赋值。@sehe,等等,所以C++11提供了确定是否提供了其中一个所需的内省?这是某种不道德的SFINAE黑客行为还是现在有一个干净的解决方案?@Karl Knechtel:不需要内省,函数重载就可以了。也就是说,C++11为与C++03相比,表达式应该允许透视更多的内容。@KarlKnechtel:对模板参数的要求通常不会被明确检查;有时,您可以使用一些类型不满足所有要求的库模板,而不知道您的代码有时可能会中断(例如,如果您不使用需要此要求的成员函数)。这在C++11中应该得到改进,但被放弃了。然而,即使在C++03中,也可以执行一些编译时自省来检查某些成员的存在。这可以与静态断言结合起来,以验证给定类型是否满足所需的要求。几个Boost库提供了实现这一点的功能.如果您正在实施其中一项,那么您应该同时实施这两项。。。。
#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;
}