Вы можете получить список всех неоцененных аргументов, выполнив
match.call(expand.dots = FALSE)$...
Или, если у вас только есть точечные аргументы, через
as.list(match.call()[-1L])
Это будет дать вам именованный список, аналогично list(...)
, но в его неоцененной форме (аналогично тому, что substitute
делает для одного аргумента).
Альтернативой является использование rlang::quos(...)
, если вы хотите использовать пакет {rlang}, который возвращает похожий результат в несколько иной форме.
Хорошо, таким образом, различия между возвратом копии и возвратом ссылки:
Производительность: Возврат ссылки может или не может быть быстрее; это зависит от как std::string
реализован Вашей реализацией компилятора (как другие указали). Но даже если Вы возвращаете ссылку присвоение после того, как вызов функции обычно включит копию, как в std::string name = obj.name();
Безопасность: Возврат ссылки может или не может вызвать проблемы (повисшая ссылка). Если пользователи Вашей функции не знают то, что они делают, храня ссылку как ссылку и с помощью нее после того, как обеспечивающий объект выходит из объема затем существует проблема.
Если Вы хотите это быстрое и безопасное повышение использования:: shared_ptr. Ваш объект может внутренне сохранить строку как shared_ptr
и возвратите a shared_ptr
. Тот путь, не будет никакого копирования объектного движения и и это всегда безопасно (если Ваши пользователи не вытаскивают необработанный указатель с get()
и действительно наполните им после того, как Ваш объект выйдет из объема).