Если ваша функция возвращает ссылку на объект, который не должен был быть скопирован, то ваша функция уже сделала то, что могла , чтобы предотвратить копирование. Если кто-то еще вызывает вашу функцию и копирует возвращаемое значение, то либо
- это ошибка , сделанная вызывающей стороной, потому что объект никогда не должен копироваться (в этом случае тип возвращаемого значения, вероятно, не должен был быть скопирован в первое место) или
- это не имеет значения для вызывающего абонента, потому что функция вызывается только один раз в неделю (в этом случае вы не должны пытаться нанести ущерб вашему код звонящего ) или
- это довольно тупой недосмотр на стороне вызывающей стороны (в этом случае ошибка будет обнаружена с помощью profiling ).
Для # 1 вы либо возвращаете свой собственный тип, либо вы можете обернуть любой свой возврат в свой собственный тип. Обратите внимание, что единственная разница между # 2 и # 3 заключается в релевантности - и , если это релевантно, профилирование найдет его.
IMO, вы не должны калечить свой код, возвращая указатель, когда вам нужна ссылка. Опытные программисты, увидев указатель, сразу же спросят, нужно ли им проверять возвращаемое значение NULL
, распределяется ли объект динамически и, если да, кто отвечает за его очистку.
Вы также не должны слепо запрещать копирование того, что вы возвращаете, если вы не можете исключить возможность того, что копирование необходимо.
В конце концов, это старый девиз, который C ++ унаследовал от C: доверяйте своим пользователям знать, что они делают.