C++ C++;11矢量在右值上复制

C++ C++;11矢量在右值上复制,c++,c++11,vector,move,rvalue-reference,C++,C++11,Vector,Move,Rvalue Reference,我在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 &

我在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;
}
所以vector仍然创建A的拷贝,我做的推越多,得到的拷贝就越多。 但是,如果我将move构造函数替换为默认构造函数A(A&&data)=default或删除带有A(常量A和数据)=删除的复制构造函数在没有复制的情况下,我得到了正确的结果。如果我第一次调用大小足够的datavec.reserve,我也没有副本。 我使用gcc版本5.4.0,没有特定参数

g++ -std=c++11 -o main ../main.cpp

你有没有想过为什么vector会复制明显的右值?我希望这不是STL的一些bug,
std::vector
在内部缓冲区重新分配期间复制您的元素。它选择复制而不是移动,因为移动构造函数未标记为
noexcept
。标记它

A(A &&) noexcept {      std::cout << "moved " << std::endl; }

A(A&&)noexcept{std::cout伟大的问题,伟大的答案,伟大的复制点。
A(A &&) noexcept {      std::cout << "moved " << std::endl; }