Типы представления 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, а также достаточно современные наборы инструментов, целевые архитектуры и т. Д.

Ответы на вопрос(8)

Ваш ответ на вопрос