Por qué no estándar definido por el literal sufijo para std::string?
-
21-12-2019 - |
Pregunta
Una pregunta rápida:¿por qué no en C++11 de ofrecer un "usuario" (en realidad, de la biblioteca estándar) define literal para la creación de un std::string
, tales como
auto str = "hello world"s; // str is a std::string
Al igual que C++, Objective-C soporta tanto el C-strings de estilo y una más amigable para el usuario tipo de biblioteca NSString
;sin embargo, a diferencia de C++, nadie se confunde entre los dos, porque es trivial para crear un NSString
prefijando un literal de cadena, con @
.De hecho, es raro ver código Objective-C, donde un literal no tiene la @
prefijo.Todo el mundo sabe que es la forma de hacerlo, usa NSString
y entra con ella.
C++11 definida por el usuario literales permite esto, y de hecho la UDL sección en Stroustrup C++11 preguntas frecuentes utiliza exactamente este ejemplo.Además, Udl sin subrayado son reservados, por lo que no habría ningún problema en permitir que un simple s
como anteriormente, no hay ninguna posibilidad de que choque con otra cosa.
Tal vez me estoy perdiendo algo, pero parece que esta sería una muy valiosa y libre de riesgo, además de la lengua, así que ¿alguien sabe por qué C++11 no ofrecen?Es probable que aparezca en C++14?
Solución
Definido por el usuario literales fueron bastante nuevo en C++11, que esto no estaba incluido, pero es en C++14( en el artículo 21.7, en caso de que alguien se preocupa).Y sí, usa s
como sufijo.El resultado exacto tipo depende del tipo de la cadena literal, un "estrecho" literal da un std::string
, una sub-16 literal da un u16string
, y un u32 literal da un u32string
.Ah, y sí, si usted insiste en el uso de una amplia cadena literal que va a producir un wstring
.
Tenga en cuenta que el s
sufijo también se utiliza para significar segundos (que se define en <chrono>
), pero en realidad no hay conflicto entre los dos -s
en un literal de cadena significa una cadena, y s
en un número de segundos.