¿Cuál es la lógica detrás de la palabra clave "usar" en C ++?
Se usa en diferentes situaciones y estoy tratando de encontrar si todos tienen algo en común y hay una razón por la cual la palabra clave "usar" se usa como tal.
using namespace std; // to import namespace in the current namespace
using T = int; // type alias
using SuperClass::X; // using super class methods in derived class

int class;. Sería aún peor si el código C ++ dejara de ser válido C ++ de repente.int class;no se compile como C ++ no es del todo malo. Se puede usar para garantizar que el código C se compilará como C. Es demasiado fácil olvidar que C y C ++ son dos lenguajes diferentes y, en términos prácticos, hay un código que es C válido y C ++ válido, pero con una semántica diferente.usingno es peor (o mejor) questatic. En mi humilde opinión, el punto de no introducir nuevas palabras clave es muy importante como lo explican los internets que están hechos de catz y Ben Voigt.Respuestas:
En C ++ 11, la
usingpalabra clave cuando se usa paratype aliases idéntica atypedef.7.1.3.2
Bjarne Stroustrup ofrece un ejemplo práctico:
Antes de C ++ 11, la
usingpalabra clave puede llevar las funciones miembro al alcance. En C ++ 11, ahora puede hacer esto para constructores (otro ejemplo de Bjarne Stroustrup):Ben Voight proporciona una razón bastante buena detrás de la razón de no introducir una nueva palabra clave o nueva sintaxis. El estándar quiere evitar romper el código antiguo tanto como sea posible. Por eso, en la documentación de propuestas verá secciones gusta
Impact on the Standard,Design decisionsy cómo pueden afectar código antiguo. Hay situaciones en las que una propuesta parece una muy buena idea, pero podría no tener tracción porque sería demasiado difícil de implementar, demasiado confusa o contradiría el código antiguo.Aquí hay un artículo antiguo de 2003 n1449 . La justificación parece estar relacionada con las plantillas. Advertencia: puede haber errores tipográficos debido a la copia desde PDF.
El documento de seguimiento n1489 explica por qué en
usinglugar de usartypedef:Creo que la distinción importante se hace aquí, alias es en lugar de tipo s. Otra cita del mismo documento:
Resumen, para el papel de
using:namespace PO = boost::program_optionsyusing PO = ...equivalente)A typedef declaration can be viewed as a special case of non-template alias-declaration. Es un cambio estético, y se considera idéntico en este caso.namespace stdal alcance global), funciones miembro, heredar constructoresNo se puede usar para:
En cambio, haga:
Nombrar un conjunto de sobrecargas.
fuente
using P = [](double)->void;es decir, AFAIK, no es válido C ++ 11. Sin embargo, esto es:using P = auto(double)->void;y produce un tipo de función (comoP*un puntero de función).registerno sonaría tan mal, está en:register X as Yregistercomienza una declaración variable, por lo que esto ya tiene un significado. Declarar una variable de registro llamada Y de tipo X.