Использование конструктора удаленных копий в singleton

Я реализовал одноэлементный шаблон, например , есть мой код:

заголовочный файл:

class Settings_manager{
public:
    static Settings_manager& get_instance();

    void operator=(Settings_manager const&) =delete;
    Settings_manager(Settings_manager const&) =delete;
...

private:
    Settings_manager();
};

реализация:

Settings_manager& Settings_manager::get_instance()
{
    static Settings_manager instance;
    return instance;
}

Settings_manager::Settings_manager()
{
    read_file();
}

Когда я пытаюсь использовать функцию get_instance в main следующим образом:

Settings_manager set = Settings_manager::get_instance();

или Settings_manager set = std::move(Settings_manager::get_instance());

Я получаю

error: use of deleted function 'Settings_manager::Settings_manager(const Settings_manager&)'
 Settings_manager set = Settings_manager::get_instance();

Может кто-нибудь сказать, что не так и объяснить? Спасибо.

Ответ 1

Посмотрите, что вы пытаетесь сделать здесь:

Settings_manager set = Settings_manager::get_instance();

У вас есть синглтон, get_instance(), и вы пытаетесь его скопировать? Это вроде бы поразило бы цель синглтона, если бы вы могли просто создать два из них правильно?

Вы хотите взять ссылку:

Settings_manager& set = Settings_manager::get_instance();

Таким образом, set является экземпляром singleton. Не копия.

Ответ 2

get_instance возвращает ссылку на ваш синглтон, который затем сохраняется в локальной переменной Settings_manager, которая должна сделать копию. set должна быть ссылочной переменной:

Settings_manager &set = Settings_manager::get_instance();