Или все же не так эффективно, как передача по ссылке?
Если применяется RVO, то одинаково эффективно возвращать значение, как и использовать выходную ссылку.
Предотвращается ли в этом случае RVO?
Нет. «Большой» не мешает объекту быть RVO'd.
Когда гарантируется применение RVO / применяется к компиляторам C ++ 20
Случайгде это не применимо:
... Оператор return может включать вызов конструктора для выполнения копирования или перемещения операнда, если он не является prvalue или его тип отличается оттип возврата функции.
Таким образом, зависит от реализации функции, гарантировано ли копирование-исключение.
В руководствах действительно не объясняется почему рекомендация должна соблюдаться.
Обратите внимание, что в исключении написано:
Исключения
Если тип дорог для перемещения (например, * 1035)*), рассмотрите возможность размещения его в бесплатном хранилище и возврата дескриптора (например, unique_ptr) или передачи его в ссылку на неконстантный целевой объект для заполнения (для использования в качестве выходного параметра).
Подсвеченное предложение в мак-исключенииУ меня больше смысла. Это дает понять, что объект слишком большой для стека, и, таким образом, уменьшает вероятность переполнения стека.