Я написал шаблон шаблона singleton, как и boost.
template <typename _T>
class Singleton
{
public :
static _T* Instance()
{
static _T obj;
return &obj;
}
protected :
Singleton() {}
private :
struct ObjectCreator
{
ObjectCreator()
{
Singleton<_T>::instance();
}
};
static ObjectCreator object_creator;
};
template <typename _T>
typename Singleton<_T>::ObjectCreator Singleton<_T>::object_creator;
И я написал основную функцию для ее проверки.
#include "Singleton.h"
class A : public Singleton <A>
{
public:
int a;
};
int main()
{
A::Instance()->a = 2;
}
Я знаю, что туманный экземпляр в ObjectCreator
конструкторе, странно, я могу скомпилировать его правильно gcc-4.4.7, затем я использовал clang-6.0, он ударил меня опечаткой.
Я думаю, gcc может сделать некоторую оптимизацию, потому что я ничего не делал с ObjectCreator
, поэтому он проигнорировал код ошибки.
У меня есть два вопроса:
- Что я должен сделать, чтобы gcc сообщила мне об этой ошибке (без изменения моего кода), например, добавить флаг компилятора?
- Если у кого-то есть более надежное объяснение этому? Некоторые официальные документы будут делать.
Ps: Я знаю, что boost добавит do_nothing
в ObjectCreate
и вызовет его из Singleton<_T>:: Instance()
чтобы избежать этой оптимизации.