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;
}