Tipos de vista en C ++: ¿pasar por constante o por valor?

Esto surgió en una discusión de revisión de código recientemente, pero sin una conclusión satisfactoria. Los tipos en cuestión son análogos al C ++ string_view TS. Son simples envoltorios no propietarios alrededor de un puntero y una longitud, decorados con algunas funciones personalizadas:

#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;
};

Se planteó la cuestión de si existe un argumento en ambos sentidos para preferir pasar tales tipos de vista (incluidos los próximos tipos string_view y array_view) por valor o por referencia constante.

Los argumentos a favor del paso por valor equivalían a "menos tipeo", "pueden mutar la copia local si la vista tiene mutaciones significativas" y "probablemente no menos eficiente".

Los argumentos a favor de pass-by-const-reference equivalían a "más idiomático para pasar objetos por const &", y "probablemente no menos eficiente".

¿Hay alguna consideración adicional que pueda cambiar el argumento de manera concluyente de una manera u otra en términos de si es mejor pasar los tipos de vista idiomática por valor o por referencia constante?

Para esta pregunta, es seguro asumir una semántica C ++ 11 o C ++ 14 y cadenas de herramientas y arquitecturas de destino suficientemente modernas, etc.

Respuestas a la pregunta(0)

Su respuesta a la pregunta