【发布时间】:2016-08-22 10:40:17
【问题描述】:
我无法弄清楚 push_back(const value_type& val) 究竟是如何工作的,在 docs 中它说的是 val
val is Value to be copied (or moved) to the new element ...
-
引用
val时如何复制? -
复制会调用
val的复制构造函数吗?
这里到底发生了什么?
#include <iostream>
#include <vector>
using namespace std;
struct x
{
x(int v = 0) : v(v) {}
int v;
};
vector<vector<x>> parts;
void fillParts()
{
vector<x> values = { x(1), x(2), x(3) };
parts.push_back(values);
}
int main()
{
fillParts();
parts[0][0].v = -123;
cout << parts[0][0].v; // -123
return 0;
}
这运行没有错误,
parts[0] 是对局部向量 values 的引用还是副本?
如果它是一个引用,它至少不应该给出一些警告,说明您访问和修改已释放堆栈的本地对象吗?
【问题讨论】:
-
使用复制构造函数复制值,
parts向量在执行push_back时复制values向量,因此在访问它们时它们不会被释放。局部变量values确实被释放了,但是具有相同底层数据的复制向量存储在“parts”中。 -
@JavierMr 是的,但
push_back引用 - 那么它如何执行values向量的复制? -
@ampawd 为什么不呢?
Copy Constructor通常采用引用方式,它可以完美地执行复制。 -
我认为编译器可能会优化代码以使用
void push_back (value_type&& val);,并且您将使用移动赋值运算符。无论如何,它将是复制或移动的实体。其实,你可以用 F11 调试它。 -
@Yola 嗯,听起来很有趣,但移动是 c++11 的特性,在以前的标准中它不会这样做
标签: c++ visual-c++ stl push-back