Код иллюстрирует, что бессмысленно иметь константный указатель на синглтон, когда вы можете получить неконстантную ссылку на синглтон в любое время через глобальный геттер. Глобальный получатель говорит: «Конечно, любой может изменить объект в любое время. Это хорошо». Функция-член const говорит: «О, нет, было бы очень плохо модифицировать этот объект».
Если класс не был одноэлементным, так что не было уверенности, что this
ссылается на тот же объект, который возвращает GetInstance
, тогда это может иметь смысл во многих случаях. Так как они ссылаются на один и тот же объект, и все знают, что они делают, потому что это одиночный объект, они не могут быть оба правы.
Вы никогда не сможете предположить, что некоторый глобально доступный объект не будет изменен (по крайней мере, вы не можете предполагать, что система const поможет вам избежать его изменения - могут быть некоторые другие свойства класса, которые делают гарантии на модификации). Так что либо GetInstance
небезопасно, либо мотивы человека, вызывающего функции-члены на const Foo
, небезопасны, в зависимости от того, кто на самом деле прав, относительно того, должен ли объект быть изменен в данном бите кода. В этом случае я не уверен, в чем смысл определения каких-либо const
функций-членов объекта, который является глобально изменяемым - если у кого-то есть постоянная ссылка на него, то откуда он взял эту ссылку и почему? И что заставляет кого-то думать, что функция с именем «Get OrSet » должна быть в первую очередь const?
Один из вариантов - для GetInstance
возвращать const Foo&
, но есть некоторые mutable
переменные-члены для вещей, которые может изменить любой, в любое время, даже через константную ссылку. Но это зависит от того, для чего фактически предназначен Foo: mutable
действительно должен использоваться только для таких вещей, как кэши, которые не изменяют "наблюдаемое" гарантированное поведение объекта.