c++ - ¿Qué es string_view?
c++11 c++14 (1)
string_view
parece ser una característica propuesta dentro de C ++ Library Fundamentals TS: N3921
Por lo que yo entiendo, 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 ?
- Si se acepta esta propuesta, ¿se convertirá canonical
const std::string&
parameter typestring_view
? - ¿Hay algún otro punto importante acerca de
string_view
para tener en cuenta?
El propósito de cualquiera y todos los tipos de propuestas de "referencia de cadena" y "referencia de matriz" es evitar copiar datos que ya son propiedad de otra parte y de los cuales solo se requiere una vista no mutante. La string_view
en cuestión es una de esas propuestas; hubo otros anteriores llamados string_ref
y array_ref
, también.
La idea siempre es almacenar un par de puntero-a-primer elemento y tamaño de alguna matriz de datos existente o cadena.
Dicha clase de manejo de vistas podría pasarse a bajo costo por valor y ofrecería operaciones de subcadenas baratas (que pueden implementarse como simples incrementos de puntero y ajustes de tamaño).
Muchos usos de las 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 potencial genuino para aumentar la eficiencia al evitar copias innecesarias (piense en todas las asignaciones y excepciones que puede guardar).
Las cadenas de 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 fácilmente subcadenas 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 mayor obstáculo y divergencia de la filosofía de la biblioteca estándar de C ++ en la que puedo pensar es que tales clases de "visión 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 verdad. La corrección de su programa depende del código de ambiente que usa estas clases. Entonces eso es más difícil de controlar y enseñar.