sirve que ppt para enum c++ templates c++11 typedef using

que - ¿Por qué los alias de tipo en C++ usan ''using'' en lugar de ''typedef'' en su sintaxis?



typedef ppt (2)

Esto es lo que dice Bjarne Stroustrup sobre por qué introdujeron el using lugar de extender typedef :

La palabra clave using se usa para obtener un nombre de notación lineal seguido de a lo que se refiere. Probamos con la solución typedef convencional y complicada, pero nunca logramos obtener una solución completa y coherente hasta que establecimos una sintaxis menos oscura.

También afirma que le gusta esta sintaxis también más para typedefs habituales:

Además de ser importante en relación con las plantillas, los alias de tipo también se pueden usar como una sintaxis diferente (y mejor IMO) para alias de tipo ordinario:

using PF = void (*)(double);

Él es bastante correcto aquí, esto parece muy limpio. En contraste, un typedef sería extremadamente intrincado con el nombre en algún lugar en el medio:

typedef void(*PF)(double);

Aquí hay una explanation (ver la página 4) de su propuesta que es aún más profunda:

Se ha sugerido (re) usar la palabra clave typedef, como se hizo en el artículo [4], para introducir alias de plantilla:

template<class T> typedef std::vector<T,MyAllocator<T>> Vec;

Esa notación tiene la ventaja de utilizar una palabra clave ya conocida para introducir un alias de tipo. Sin embargo, también muestra varias desventajas entre las cuales la confusión de usar una palabra clave conocida para introducir un alias para un nombre de tipo en un contexto donde el alias no designa un tipo, sino una plantilla; Vec no es un alias para un tipo, y no debe tomarse para un typedef-name. El nombre Vec es un nombre para la familia std::vector<*,MyAllocator<*>> , donde el asterisco es un marcador de posición para un nombre de tipo. En consecuencia, no proponemos la sintaxis "typedef".

template<class T> using Vec = std::vector<T,MyAllocator<T>>;

se puede leer / interpretar como: de ahora en std::vector<T,MyAllocator<T>> Vect<T> como sinónimo de std::vector<T,MyAllocator<T>> . Con esa lectura, la nueva sintaxis para aliasing parece razonablemente lógica.

Entonces básicamente tiene dos puntos aquí:

  1. Una plantilla que using convierte en una familia de tipos, no en un tipo, por lo que typedef está "equivocado"
  2. using se puede leer casi como una oración en inglés

Claramente, los alias de tipo y alias de tipo de plantilla son semánticamente equivalentes a typedefs y una extensión de typedefs para soportar la plantilla. ¿Cómo es que se creó una nueva sintaxis con la palabra clave using para estos en lugar de usar typedefs para la primera y alguna extensión de sintaxis con la palabra typedef ?

NOTA: Esto no es un clon de la pregunta "diferencia entre usar y typedef". Sé que el using da la ventaja de definir una familia de typedef . Lo que estoy preguntando es por qué la gente estándar decidió tener esta extensión usando la palabra clave using lugar de la palabra clave typedef . Esto parece que simplemente agrega confusión en el lenguaje.


Lo que sugieres en realidad fue propuesto en 2002 en el documento N1406 por Herb Sutter. Permitiría, por ejemplo, escribir:

template<typename T> typedef X<T,int> Xi;

Esto fue revisado más tarde en N1449 por Gabriel Dos Reis y Mat Marcus. Adoptan la sintaxis de using y notan lo siguiente:

Tenga en cuenta que evitamos específicamente el término "plantilla typedef" e introducimos la nueva sintaxis que implica el par "using" y "=" para ayudar a evitar confusiones: no estamos definiendo ningún tipo aquí, estamos introduciendo un sinónimo (es decir, alias) para un abstracción de un id de tipo (es decir, expresión de tipo) que involucra parámetros de plantilla.

También dicen:

Se realizaron dos encuestas de paja con respecto a la sintaxis. Una gran mayoría votó para evitar la sintaxis de la plantilla typedef, a favor de la sintaxis "=". Un segundo voto indicó una fuerte preferencia por la palabra clave "usar" en lugar de una palabra como "alias" o la ausencia de una palabra clave como en la versión borrador de esta propuesta. La motivación para usar cualquier palabra clave surgió en parte del deseo de utilizar una sintaxis que podría ser compatible con la dirección de alias sin plantilla brevemente descrita anteriormente.

Esta sintaxis fue luego adoptada en la propuesta final N2258 por Gabriel Dos Reis y Bjarne Stroustrup.