我在std::向量上有一些奇怪的行为,添加了rvalue:
#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!所以向量仍然创建A的副本,我做的越多,我得到的拷贝就越多。但是,如果我用默认的A(A &data) = default;或delete复制构造函数替换A(const &data)= delete;,则在没有复制的情况下得到正确的结果。如果我第一次调用具有足够大小的datavec.reserve,我也没有副本。我使用gcc版本5.4.0,没有具体的参数
g++ -std=c++11 -o main ../main.cpp你对为什么向量复制明显的rvalue有任何想法吗?我希望这不是STL的错误
发布于 2017-04-05 15:05:27
std::vector在内部缓冲区重新分配期间复制元素。它选择复制而不是移动,因为移动构造函数没有标记为noexcept。标记它..。
A(A &&) noexcept { std::cout << "moved " << std::endl; }...will解决了这个问题。
告诉编译器移动构造函数不会抛出允许std::vector的实现在内部重新分配期间移动,从而满足C++标准所要求的异常保证。
或者,您可以提前std::vector::reserve容器以防止内部缓冲区的增长。
https://stackoverflow.com/questions/43234946
复制相似问题