Компилятор не знал бы, хотели ли Вы сравнение указателя или глубокое (внутреннее) сравнение.
более безопасно просто не, реализуют его и позволяют программисту сделать это самостоятельно. Тогда они могут сделать все предположения, которые они любят.
Это не сработало, потому что вам удалось получить поражение в результате фиаско статического порядка инициализации .
Вы не можете переместить свой код, инициализирующий статические объекты, за пределы единицы трансляции (вы можете прочитать его как исходный файл), в котором используются эти статические объекты. Не так, как ты это сделал. Если вы хотите использовать схему, которую вы используете для инициализации этих статических объектов, переместите только объявления в заголовок init.hpp, но оставьте instatiations StaticLibInitializer staticLibInitializer;
в каждом файле, который использует статические объекты.
Приведенный выше совет предполагает, что каждый виджет использует только свои собственные ресурсы. Если у вас есть ситуация, в которой ресурсы одного виджета используются другим виджетом, вы снова столкнетесь с фиаско статического порядка инициализации. Вы можете управлять этой ситуацией, используя такой код
StaticLibInitializer
{
void initialize()
{
static Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
StaticLibInitializer()
{
initialize();
}
}
, чтобы убедиться, что несколько экземпляров StaticLibInitializer инициализируют данный ресурс только один раз, а затем создают экземпляр StaticLibInitializer для каждого ресурса, который вы собираетесь использовать в данной единице перевода.
Макрос Q_INIT_RESOURCE не может использоваться в пространстве имен.
Позвольте мне процитировать руководство по qt: «Примечание. Этот макрос нельзя использовать в пространстве имен. Его следует вызывать из главный()". И даже он дает вам пример того, как сделать это правильно, если это невозможно:
inline void initMyResource() { Q_INIT_RESOURCE(myapp); }
namespace MyNamespace
{
...
void myFunction()
{
initMyResource();
}
}
Пожалуйста, посмотрите сами, почему и как именно он выходит из строя или не дает сбоев, если вы используете его неопределенным образом. Соответствующий код находится в QtCore.