¿Qué es string_view?

162

string_viewera una característica propuesta dentro de C ++ Library Fundamentals TS ( N3921 ) agregada a C ++ 17

Según tengo entendido, es un tipo que representa algún tipo de "concepto" de cadena que es una vista de cualquier tipo de contenedor que podría almacenar algo visible como una cadena.

  • Es esto correcto ?
  • ¿Debería const std::string&convertirse el tipo de parámetro canónico string_view?
  • ¿Hay otro punto importante string_viewa tener en cuenta?
Drax
fuente
44
Finalmente, alguien se da cuenta de que las cadenas necesitan una semántica diferente, aunque introducir string_view es solo un pequeño paso.
John Z. Li el

Respuestas:

183

El propósito de todos y cada uno de los tipos de propuestas de "referencia de cadena" y "referencia de matriz" es evitar copiar datos que ya son propiedad de otro lugar y de los cuales solo se requiere una vista no mutante. La string_viewen cuestión es una de esas propuestas; hubo otros llamados string_refy array_reftambién.

La idea siempre es almacenar un par de puntero al primer elemento y el tamaño de una matriz o cadena de datos existente .

Tal clase de manejador de vista podría transmitirse de forma económica por valor y ofrecería operaciones de subcadena baratas (que pueden implementarse como simples incrementos de puntero y ajustes de tamaño).

Muchos usos de cadenas no requieren la posesión real de las cadenas, y la cadena en cuestión a menudo ya será propiedad de otra persona. Por lo tanto, existe un verdadero potencial para aumentar la eficiencia al evitar copias innecesarias (piense en todas las asignaciones y excepciones que puede guardar).

Las cadenas C originales sufrían el problema de que el terminador nulo formaba parte de las API de cadena, por lo que no podía crear subcadenas fácilmente sin mutar la cadena subyacente (a la strtok). En C ++, esto se resuelve fácilmente almacenando la longitud por separado y envolviendo el puntero y el tamaño en una clase.

El principal obstáculo y divergencia de la filosofía de la biblioteca estándar de C ++ que se me ocurre es que tales clases de "vista referencial" tienen una semántica de propiedad completamente diferente del resto de la biblioteca estándar. Básicamente, todo lo demás en la biblioteca estándar es incondicionalmente seguro y correcto (si se compila, es correcto). Con clases de referencia como esta, eso ya no es cierto. La exactitud de su programa depende del código ambiental que utiliza estas clases. Eso es más difícil de verificar y enseñar.

Kerrek SB
fuente
19
El barco navegó en esa filosofía con reference_wrapper, ¿no?
Steve Jessop
55
@KerrekSB Me temo que no te sigo. ¿Podría ampliar la parte de "tales clases de vista referencial tienen una semántica de propiedad completamente diferente del resto de la biblioteca estándar" , por favor? No me queda claro: ¿en qué se diferencia de las referencias / punteros colgantes? ¿O iteradores invalidados debido a la inserción (por ejemplo, std :: vector)? Ya tenemos estos problemas, es muy natural para mí que una vista no propietaria tenga problemas similares a los punteros / referencias / iteradores no propietarios.
Ali
55
@ Ali: Cuando usa cualquier otro contenedor de biblioteca estándar, puede afirmar la exactitud del código simplemente mirando el código que usa el contenedor. No es así por string_view. (No estaba diciendo que nunca se puede escribir código roto. Solo que el roto es local ).
Kerrek SB
66
Estoy sorprendido de que no se hayan ido std::rangede boost::iterator_range- IMO es mejor que la idea de string_view
Charles Salvia
19
@nwp: Muchas personas y lenguajes han llegado a lamentarse de los terribles valores predeterminados de C ++ y piensan que "const" y "no compartido" deberían ser los valores predeterminados, con "mutable" y "compartido" las excepciones explícitas y raras.
Kerrek SB