В первом случае синглтон создается (вызывается конструктор) при инициализации программы до вызова main()
. В этом случае вам также необходимо определить статическую переменную где-нибудь в вашем файле cpp.
Во втором случае синглтон создается при первом вызове функции. Помните, что эта реализация не является поточно-ориентированной, поскольку инициализация статических переменных в функциях не является поточно-ориентированной. Если два потока вызывают эту функцию в первый раз, есть небольшая вероятность, что вы получите два синглета.
Также обратите внимание, что у вас есть ошибка во втором. Вы не можете определить ссылку без инициализации. Это
static SomeClass &var;
Не компилируется. Вам нужно удалить ссылку, чтобы создать фактический экземпляр класса, а не ссылку, а затем вернуть ссылку на него.
Если во втором примере вы определили статическую переменную как указатель, вы можете избежать упомянутой мной проблемы с многопоточностью, аккуратно инициализируя указатель. Подробнее об этом читайте в статье этого класса (которая говорит о Java, но основная проблема та же)