smart - ¿Por qué los literales C++ 14 definidos de forma estándar en el espacio de nombres global de forma predeterminada?
smart contracts ethereum (3)
C ++ 14 incluye literales definidos estándar para, entre otras cosas, std::string
y varios intervalos de tiempo desde el encabezado <chrono>
.
Para usarlos debes decir using namespace std::literals;
(o alguna variación dependiendo de exactamente qué literales desea, ya que están en una variedad de espacios de nombres en línea).
Todo esto es bueno, pero tengo curiosidad por saber por qué se requiere la declaración de using
. Las UDL sin un guión bajo están reservadas para la implementación, por lo que no hay posibilidad de que "hello world"s
pueda significar otra cosa en un programa que cumpla con los estándares.
Entonces, ¿por qué no es suficiente #include <string>
para llevar la función de conversión literal al alcance? ¿Por qué debo incluir explícitamente el espacio de nombres literal?
EDITAR: N3531 es la versión más reciente de la propuesta que pude encontrar; desafortunadamente no discute la motivación para poner las cosas en un espacio de nombres, solo dice:
Uno puede resumir los requisitos de la discusión de [Portland] de la siguiente manera:
- usar un espacio de nombres en línea para un (grupo de operadores UDL relacionados)
La biblioteca estándar ya define múltiples versiones de lo que s
puede significar:
- Se puede usar para definir una cadena literal.
- Se puede utilizar para definir un literal
chrono::seconds
.
Uno se basa en una cadena literal, uno se basa en un entero o un double
literal, por supuesto, es decir, realmente pueden coexistir. Sin embargo, espero que haya más usos de s
en el futuro. Por lo tanto, tener que elegir qué espacios de nombres se importan en lugar de imponerle un nombre parece un enfoque razonable.
Mira el papel N2765. Las UDL se enganchan en el proceso de búsqueda de nombres regular. Como los literales de cadena tienen tipos de cadena comunes, hay una gran posibilidad de colisión si ignora los espacios de nombres.
Ya hay dos UDL llamadas s
: una para cadenas y otra para seconds . Debido a que los nombres de los sufijos son comprensiblemente concisos, sufren crónicamente de conflictos de nombres, por lo que verlos a todos en un espacio de nombres no puede ir bien por mucho tiempo. Por lo tanto, se decidió que se colocaran en espacios de nombres en línea, lo que permitía tanto que no fueran ambiguos ( using namespace std::literals::chrono_literals
) como simples using
directivas ( using namespace std
).