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.