Если ваша функция возвращает ссылку на объект, который не должен был быть скопирован, то ваша функция уже сделала то, что могла сделать, чтобы предотвратить копирование.Если кто-то вызывает вашу функцию и копирует возвращаемое значение, то либо
- что это ошибка абонент сделал, потому что объект никогда не должны быть скопированы (в этом случае тип возвращаемого значения, вероятно, не должен» т были копируемыми в первую очередь), или
- это значения для вызывающего абонента, поскольку функция вызывается только один раз в неделю (в этом случае вы не должны пытаться покалечить код Абонентов), или
- это довольно немого контроль на стороне вызывающего абонента (в этом случае ошибка будет найдена профилирования).
Для # 1 либо у вас есть свой тип, либо вы можете обернуть любое ваше возвращение в своем собственном типе. Следует отметить, что единственное различие между # 2 и # 3 является актуальность - и если это уместно, профилирование найдет.
IMO вы не должны наносить ущерб вашему коду, возвращая указатель, когда вам нужна ссылка. Опытные программисты, увидев указатель, сразу спросят, нужно ли им проверять возвращаемое значение NULL
, независимо от того, распределяется ли объект динамически и, если да, кто несет ответственность за его очистку.
Вы также не должны слепо запрещать копирование всего, что вы возвращаете, если вы не можете исключить возможность копирования.
В конце концов, это старый девиз, который C++ унаследовал от C: доверяйте своим пользователям знать, что они делают.
что вы имеете в виду под «абонент получает его в качестве ссылки»? Если функция возвращает ссылку, она возвращает ссылку, а ссылка - это все «вызывающий». Теперь, что делает вызывающий абонент с этой ссылкой, другое дело. Он/она может захотеть создать копию упомянутого объекта. Если вы этого не хотите, сделайте тип объекта не скопированным. – sellibitze
Я хочу сделать эту копию намеренной, и когда они используют функции get, они должны быть вынуждены принимать ссылки компилятором. Но похоже, что это невозможно для классов библиотеки – Gokul