【发布时间】:2017-08-31 06:57:12
【问题描述】:
我在 std::vector 添加右值时有一些奇怪的行为:
#include <iostream>
#include <vector>
class A {
public:
A():i_{5}{std::cout << "default" << std::endl;}
A(const A &data) { std::cout << "copied!" << std::endl; }
A(A &&data) { std::cout << "moved " << std::endl; }
int i_;
};
int main(int argc, char *argv[]) {
std::vector<A> datavec;
datavec.push_back(A{});
datavec.push_back(A{});
return 0;
}
输出是:
default
moved
default
moved
copied!
所以 vector 仍然会创建 A 的副本,我做的推动越多 - 我得到的副本就越多。 但是,如果我用默认的 A(A &&data) = default; 替换移动构造函数或用 A(const A &data) = delete; 删除复制构造函数,我会得到正确的结果没有复制的地方。如果我首先调用具有足够大小的 datavec.reserve,我也没有副本。 我使用没有特定参数的 gcc 版本 5.4.0
g++ -std=c++11 -o main ../main.cpp
你有没有想过为什么 vector 会复制明显的右值?我希望这不是 STL 的一些错误
【问题讨论】:
-
好问题,好答案,好重复的地方。
标签: c++ c++11 vector move rvalue-reference