std :: vector <{QString,int *}>的奇怪行为

时间:2018-07-08 09:19:32

标签: c++ qt c++11 move-semantics

考虑以下程序:

#include <QString>
#include <QDebug>
#include <vector>

class A {
public:
    QString str;
    int *pointer;
    A(QString s) : str(s), pointer(0) {}
};

int main() {
    std::vector<A> v;
    v.emplace_back("111");
    v.emplace_back("222");
    v.emplace_back("333");
    v.emplace_back("444");
    v.emplace_back("555");
    for (const A &a : v)
        qDebug() << a.str;
    return 0;
}

使用g++ main.cpp -O3 -std=c++17 -Wall -fPIC -I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core(GCC版本8.1.1,Qt版本5.11.1,Arch Linux)进行编译时,它会产生以下意外输出:

""
""
""
""
"555"

但是,当使用-O2或clang ++或显式请求默认的复制构造函数时,它会起作用:

A(const A &b) = default;

代码有什么问题? (也许在增加向量的大小时在移动操作中发生了不好的事情吗?)

1 个答案:

答案 0 :(得分:0)

事实证明这是GCC中的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87665

感谢您的帮助!