我已经声明了这样的结构:
struct Point{
double x,y;
Point(){}
Point(double xx,double yy): x(xx),y(yy){}
};
我试图像这样填充矢量:
vector<Point> s(1);
Point tmp(1,2);
s[0]=tmp;
s.push_back(s[0]);
不幸的是,当我显示s [1]的内容时,这样做会给我一个错误的答案,但是s.push_back((Point)s[0])
会导致预期的答案(例如s [0]的副本)。
有什么区别
解释这种差异的s.push_back(s[0])
和s.push_back((Point)s[0])
是什么?
是否有任何自动类型转换或内幕消息?
答案 0 :(得分:3)
push_back
通过const引用获取参数(以及rvalue引用的其他重载),所以
s.push_back(s[0]);
使用第一个元素的左值引用,但是,如果容量不够大,push_back
可能会重新分配。因此从s[0]
拉出的参考文献仍悬空,不再可行。
另一方面
s.push_back((Point)s[0]);
创建一个临时文件,然后不再使用s[0]
,允许在Point
中推送有效的vector
。