有两个向量std :: vector和QVector.我们必须检查插入时“移位”元素的方式. (用五个元素构造两个向量并插入零元素)我有这个代码:
#include <QVector> #include <QTextStream> struct MoveTest { int i; Movetest() {} MoveTest(const MoveTest& other) {QTextStream(stdout) << "constr copy" << endl;} MoveTest(MoveTest &&other) {QTextStream(stdout) << "constr move" << endl;} ~Movetest() {} inline MoveTest& operator= (const MoveTest& other) {QTextStream(stdout) << "copy" << endl;} inline MoveTest& operator= (MoveTest &&other) {QTextStream(stdout) << "move" << endl;} }; int main(int argc,char *argv[]) { QTextStream(stdout) << "std::move:" << endl; MoveTest t1; MoveTest t2(std::move(t1)); t1 = std::move(t2); QTextStream(stdout) << "QVector:" << endl; QVector<MoveTest> qmTest(5); qmTest.insert(qmTest.begin(),Movetest()); QTextStream(stdout) << "std::vector:" << endl; std::vector<MoveTest> mTest(5); mTest.insert(mTest.begin(),Movetest()); return 0; }
我的输出是gcc 4.7.2,QMAKE_CXXFLAGS = -std = c 0x:
std::move: constr move move QVector: constr copy constr copy constr copy constr copy constr copy constr copy copy copy copy copy copy copy std::vector: constr move constr copy constr copy constr copy constr copy constr copy
如何在不复制的情况下插入具有内部移位的元素?需要什么GCC标志?
解决方法
由于您的move运算符可以抛出异常,因此std :: vector无法使用它.如果运算符在调整大小过程中途抛出异常,它会怎么做?如果它不能抛出异常并且向量实现可以使用它,则声明它为
noexcept.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。