EDIT: см. Ответ GWW, проблема заключалась в том, чтобы просто сделать незаконную копию с помощью C :: Instance(). И я ошибся, ошибка не зависит от mutable.Объекты Singleton с изменяемыми членами
Статические методы несовместимы с изменяемыми методами? Вот упрощенная версия моего кода:
c.h:
class C
{
public:
static C& Instance();
private:
C();
mutable QMutex _mutex;
};
c.cpp:
C& C::Instance()
{
static C instance;
return instance;
}
C c = C::Instance();
Тогда ошибка я получаю (GCC 4.2)
error: 'QMutex::QMutex(const QMutex&)' is private within this context
synthesized method 'C::C(const C&)' first required here //at C::Instance()
Если я удалить «изменчивый» ключевое слово эта ошибка уходит, но потом Конечно, я не могу использовать методы блокировки/разблокировки _mutex const. Написание собственного экземпляра ctor ничего не меняет. Кто-нибудь знает, как это решить? NB это похоже на this post, но это объективный C, и там было слишком много кода, который не казался релевантным этому вопросу.
EDIT: Только что понял, что проблема заключается в том, что копия QMutex ctor является частной. Но я не понимаю, почему «изменчивый» должен иметь значение здесь, то есть почему он вызывает копию.
'C c = C :: Instance();' скопирует экземпляр? Вы уверены, что это то, что вы хотите сделать? – GWW
@GWW О, ты прав! * blush * –
Итак, вопрос сводится к следующему: как 'mutable' влияет на публичный/частный характер созданного компилятором конструктора копий? –