Как реализация Майерса синглтона на самом деле синглтон

Я много читал о синглетонах, когда их следует и не следует использовать, и как их безопасно применять. Я пишу на C ++ 11 и натолкнулся на ленивую инициализированную реализацию Мейера синглтона, как видно изэтот вопрос.

Эта реализация:

static Singleton& instance()
{
     static Singleton s;
     return s;
}

Я понимаю, как это защищено от других вопросов здесь, на SO, но я не понимаю, как это на самом деле одноэлементный шаблон. Я реализовал синглтоны на других языках, и они всегда заканчиваются примерно так:Википедия:

public class SingletonDemo {
        private static volatile SingletonDemo instance = null;

        private SingletonDemo() {       }

        public static SingletonDemo getInstance() {
                if (instance == null) {
                        synchronized (SingletonDemo .class){
                                if (instance == null) {
                                        instance = new SingletonDemo ();
                                }
                      }
                }
                return instance;
        }
}

Когда я смотрю на этот второй пример, становится очень интуитивно понятно, как это синглтон, поскольку класс содержит ссылку на один экземпляр самого себя и только когда-либо возвращает этот экземпляр. Однако в первом примере я не понимаю, как это предотвращает существование двух экземпляров объекта. Итак, мои вопросы:

Как в первой реализации применяется одноэлементный шаблон? Я предполагаю, что это связано с ключевым словом static, но я надеюсь, что кто-то сможет подробно объяснить мне, что происходит под капотом.Между этими двумя стилями реализации один предпочтительнее другого? Каковы плюсы и минусы?

Спасибо за любую помощь,

Ответы на вопрос(0)

Ваш ответ на вопрос