Возврат ссылки константы на объект вместо копии

Вы можете получить список всех неоцененных аргументов, выполнив

match.call(expand.dots = FALSE)$...

Или, если у вас только есть точечные аргументы, через

as.list(match.call()[-1L])

Это будет дать вам именованный список, аналогично list(...), но в его неоцененной форме (аналогично тому, что substitute делает для одного аргумента).

Альтернативой является использование rlang::quos(...), если вы хотите использовать пакет {rlang}, который возвращает похожий результат в несколько иной форме.

70
задан Rob 25 September 2008 в 17:33
поделиться

1 ответ

Хорошо, таким образом, различия между возвратом копии и возвратом ссылки:

  • Производительность: Возврат ссылки может или не может быть быстрее; это зависит от как std::string реализован Вашей реализацией компилятора (как другие указали). Но даже если Вы возвращаете ссылку присвоение после того, как вызов функции обычно включит копию, как в std::string name = obj.name();

  • Безопасность: Возврат ссылки может или не может вызвать проблемы (повисшая ссылка). Если пользователи Вашей функции не знают то, что они делают, храня ссылку как ссылку и с помощью нее после того, как обеспечивающий объект выходит из объема затем существует проблема.

Если Вы хотите это быстрое и безопасное повышение использования:: shared_ptr. Ваш объект может внутренне сохранить строку как shared_ptr и возвратите a shared_ptr. Тот путь, не будет никакого копирования объектного движения и и это всегда безопасно (если Ваши пользователи не вытаскивают необработанный указатель с get() и действительно наполните им после того, как Ваш объект выйдет из объема).

7
ответ дан 24 November 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: