C++ 复制构造函数和向量的问题

C++ 复制构造函数和向量的问题,c++,constructor,C++,Constructor,我遇到了复制构造函数和向量的问题 #include <iostream> #include <vector> using namespace std; class B { private: int val; }; class A { private: B b; public: A() {} A(A& a) {} }; int main(int argc, char const *argv[]) { A aa;

我遇到了复制构造函数和向量的问题

#include <iostream>
#include <vector>
using namespace std;

class B {
private:
    int val;
};

class A {
private:
    B b;
public:
    A() {}
    A(A& a) {}
};

int main(int argc, char const *argv[])
{
    A aa;
    A a2 = aa;//it works well
    //addA(va, aa);
    return 0;
}
#包括
#包括
使用名称空间std;
B类{
私人:
int-val;
};
甲级{
私人:
B B;
公众:
A(){}
A(A&A){}
};
int main(int argc,char const*argv[]
{
A aa;
a2=aa;//它工作得很好
//addA(va,aa);
返回0;
}
但当我这样做的时候:

#include <iostream>
#include <vector>
using namespace std;

class B {
private:
    int val;
};

class A {
private:
    B b;
public:
    A() {}
    A(A& a) {}
};

void addA(std::vector<A>& va, A a) {
    va.push_back(a);
}

int main(int argc, char const *argv[])
{
    std::vector<A> va;
    A aa;
    A a2 = aa;
    addA(va, aa); // I got a compile error
    return 0;
}
#包括
#包括
使用名称空间std;
B类{
私人:
int-val;
};
甲级{
私人:
B B;
公众:
A(){}
A(A&A){}
};
void addA(std::vector&va,A){
va.推回(a);
}
int main(int argc,char const*argv[]
{
std::向量va;
A aa;
a2=aa;
addA(va,aa);//我得到一个编译错误
返回0;
}
有一个编译器错误

但是,如果我将类
A
的复制构造函数中的args更改为
const A&
,它会工作得很好


为什么会这样?

std::vector::push_back的参数是
常量A&
,因此当向量试图将其复制到为元素分配的存储中时,它需要一个采用
常量A&
的构造函数。因为你的没有,所以它不能被使用。

这是一个奇怪的复制构造函数签名A(A&A),为什么你允许对象被复制并被更改?唯一一个有这个签名的类是auto_ptr,我们都知道它造成了多少混乱。