Los literales definidos por el usuario deben comenzar con un guión bajo.
Esta es una regla más o menos universalmente conocida que se puede encontrar en todos los sitios redactados hablando de literales de usuario. También es una regla que yo (¿y posiblemente otros?) He ignorado descaradamente desde entonces sobre una base de "qué mierda". Ahora, por supuesto, eso no es correcto. En el sentido más estricto, esto utiliza un identificador reservado y, por lo tanto, invoca Comportamiento indefinido (aunque prácticamente no obtiene un encogimiento de hombros del compilador).
Entonces, reflexionando si debería continuar ignorando deliberadamente esa parte (en mi opinión inútil) de la norma o no, decidí mirar lo que realmente está escrito. Porque, ya sabes, qué importa lo que todos sepan . Lo que importa es lo que está escrito en el estándar.
[over.literal]
establece que "algunos" identificadores de sufijo literales están reservados, vinculando a [usrlit.suffix]
. El último establece que todos están reservados, excepto aquellos que comienzan con un guión bajo. OK, eso es exactamente lo que ya sabíamos, escrito explícitamente (o más bien, escrito al revés).
Además, [over.literal]
contiene una Nota que sugiere algo obvio pero preocupante:
a excepción de las restricciones descritas anteriormente, son funciones comunes de espacio de nombres y plantillas de funciones
Bueno, claro que lo son. En ninguna parte dice que no lo son, entonces, ¿qué más esperarías que sean?
Pero espera un momento. [lex.name]
establece explícitamente que cada identificador que comienza con un guión bajo en el espacio de nombres global está reservado.
Ahora, un operador literal generalmente, a menos que lo coloque explícitamente en un espacio de nombres (¡lo cual, creo que nadie hace !?), está muy en el espacio de nombres global. Entonces, el nombre, que debe comenzar con un guión bajo, está reservado. No se menciona una excepción especial. Entonces, cada nombre (con guión bajo o sin él) es un nombre reservado.
¿Se espera que ponga literales definidos por el usuario en un espacio de nombres porque el uso "normal" (subrayado o no) está usando un nombre reservado?
_km
(por kilómetros) en el espacio de nombres udl
. ¿Entonces un literal para 5 km parece ... 5udl::_km
?
using
están las declaraciones. En el ámbito donde necesita usar el literal, tenga una instrucción de uso que lo importe.