Поэтому код, упомянутый в строке темы, вызывает ошибку сегментации в Qt 4.8.3 & gcc 4.7.2
Это вне любых классов / структур в .cpp-файле и работает с gcc 4.4
const QList<int> warnings = QList<int>() << 0 << 3 << 7;
Трассировка дает эти две подсказки:
__do_global_ctors()
__static_initialization_and_destruction_0
Таким образом, кажется, что «предупреждение» еще не доступно при вставке в него последнего списка.
Работает с 4.7.2, если я изменю это на это:
global scope: QList< int> warnings;
Это какая-то функция:
warnings = QList<int>() << 0 << 3;
Мне интересно, почему это происходит?
Редактировать:
Я предполагаю, что изначально я вырезал слишком много материала из своего вопроса, но предполагается, что предупреждения должны быть постоянными в области видимости файла (.cpp-файл) для хранения перечислений.
Мои умственные способности отладки говорят мне, что рассматриваемая строка существует в глобальной области / области файла, а не в области класса / функции. Таким образом, ваша строка может быть вызвана в любой точке статической инициализации. С вашим старым gcc просто так получилось, что QT инициализирован до Ваша линия была названа. С новым gcc он переупорядочил (совершенно допустимый) статический init, чтобы сначала вызвать вашу функцию, прежде чем QT будет готов создавать объекты и вставлять в них.
Решение состоит в том, чтобы отложить создание QList
до после main
начинается. Использование указателей или статических локальных объектов является двумя распространенными реализациями.
Других решений пока нет …