¿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.using
no 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
using
palabra clave cuando se usa paratype alias
es idéntica atypedef
.7.1.3.2
Bjarne Stroustrup ofrece un ejemplo práctico:
Antes de C ++ 11, la
using
palabra 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 decisions
y 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
using
lugar 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_options
yusing 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 std
al 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).register
no sonaría tan mal, está en:register X as Y
register
comienza una declaración variable, por lo que esto ya tiene un significado. Declarar una variable de registro llamada Y de tipo X.