std::vector<{QString,int*}> 的奇怪行为
Strange behaviour of std::vector<{QString,int*}>
考虑以下程序:
#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;
代码有什么问题? (也许在增加矢量大小时的移动操作中发生了一些不好的事情?)
事实证明这是 GCC 中的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87665
感谢您的帮助!
考虑以下程序:
#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;
代码有什么问题? (也许在增加矢量大小时的移动操作中发生了一些不好的事情?)
事实证明这是 GCC 中的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87665
感谢您的帮助!