Типы представления C ++: проход по константе или по значению?
Это недавно появилось в обсуждении обзора кода, но без удовлетворительного заключения. Рассматриваемые типы являются аналогами C ++ string_view TS. Это простые не имеющие оболочки оболочки вокруг указателя и длины, украшенные некоторыми пользовательскими функциями:
#include <cstddef>
class foo_view {
public:
foo_view(const char* data, std::size_t len)
: _data(data)
, _len(len) {
}
// member functions related to viewing the 'foo' pointed to by '_data'.
private:
const char* _data;
std::size_t _len;
};
Возник вопрос о том, есть ли аргумент, так или иначе предпочитающий передавать такие типы представлений (включая предстоящие типы string_view и array_view) по значению или по константной ссылке.
Аргументы в пользу передачи по значению означают «меньше печатания», «могут видоизменять локальную копию, если представление имеет значимые мутации», и «вероятно, не менее эффективны».
Аргументы в пользу pass-by-const-reference составили «более идиоматично передавать объекты по const &» и «вероятно, не менее эффективны».
Существуют ли какие-либо дополнительные соображения, которые могут окончательно изменить аргумент в одну или другую сторону с точки зрения того, лучше ли передавать идиоматические типы представлений по значению или по константной ссылке.
Для этого вопроса можно предположить семантику C ++ 11 или C ++ 14, а также достаточно современные наборы инструментов, целевые архитектуры и т. Д.