Claramente, alias de tipo y con plantilla de tipo de alias son semánticamente equivalentes a las definiciones de tipos y una extensión de las definiciones de tipos para el apoyo de la plantilla. ¿Cómo es la nueva sintaxis con la using palabra clave fue creado para que estos en lugar de utilizar las definiciones de tipos para el primer y algunos sintaxis de la extensión de la palabra typedef.

NOTA: Este no es un clon de la «diferencia entre el uso y typedef» pregunta. Sé que using da la ventaja de la definición de una familia de typedefs. Lo que yo estoy preguntando es ¿por qué el estándar de las personas a decidir sobre tener esta extensión de uso de la using de palabras clave en lugar de la typedef palabra clave. Esto parece que sólo añade confusión en el lenguaje.

  • no es. Sé que using da la ventaja de la definición de una familia de typedefs. Lo que yo estoy preguntando es ¿por qué el estándar de las personas a decidir sobre tener esta extensión de uso de la using de palabras clave en lugar de la typedef palabra clave. Esto parece que sólo añade confusión en el lenguaje.
  • Posiblemente esto tiene que ver con los problemas mencionados en el N1406 y cómo N1499 resuelve. La solución se refleja en la sintaxis: plantilla de los alias no definir tipos, como un typedef plantilla sugeriría, y se opuso a la propuesta original de typedef plantillas que permiten la especialización (en una versión de la misma).
  • TL;DR porque typedef es un horrible ilegible hack y fue una oportunidad para sustituir con un limpiador suave sintaxis.
  • dyp typedef no agregar un tipo cualquiera, tradicionalmente lo que se le llama es débil, pero eso sólo significa que no hay ningún nuevo tipo en el compilador el tipo de tabla.
InformationsquelleAutor tohava | 2014-07-23

2 Comentarios

  1. 30

    Lo que se sugiere en realidad fue propuesto en el año 2002, en el documento N1406 por Herb Sutter. Esto permitiría, por ejemplo, para escribir:

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

    Este fue revisado en N1449 por Gabriel Dos Reis y el Tapete de Marcus. Adoptan la using sintaxis, y tenga en cuenta lo siguiente:

    Tenga en cuenta que nosotros específicamente evitar el término «typedef plantilla» e introducir la nueva sintaxis que implican la par de «uso» y «=» para ayudar a evitar la confusión: no somos la definición de todos los tipos de aquí, presentamos un sinónimo (es decir, alias) para una abstracción de un tipo-id (es decir, el tipo de expresión) de la participación de los parámetros de la plantilla.

    También estado:

    Dos de paja se realizaron encuestas con respecto a la sintaxis. Una gran mayoría votó a favor de evitar el typedef sintaxis de la plantilla, en favor de la «=» sintaxis. La segunda votación se indica una fuerte preferencia por el «uso» de la palabra clave en contraposición a una palabra como «alias» o la ausencia de alguna palabra clave, como en la versión borrador de esta propuesta. La motivación para el uso de cualquier palabra clave en todo surgió, en parte por el deseo utilizar una sintaxis que puede ser compatible con la no-plantilla de aliasing dirección brevemente descritos anteriormente.

    Esta sintaxis se adoptó en la propuesta final N2258 por Gabriel Dos Reis y Bjarne Stroustrup.

    • También se podría mencionar que ha habido una discusión acerca de la semántica de los alias de plantillas, N1406/2.2 «La Elección Principal: la Especialización frente a Todo lo Demás». El using = refleja la semántica a la sintaxis de nivel.
    • Una plantilla de es parámetros de tipo. Stroustroup mismo, incluso dijo que en un papel en 1989 [usenix.org/legacy/publications/compsystems/1989/…. Así que, yo diría que está la creación de un nuevo tipo o familia de tipos. Pero, de hecho, me gusta la nueva sintaxis, así que no me quejo más de lo que por lo general se quejan de C++ de ser demasiado complicado.
  2. 43

    Aquí es lo que Bjarne Stroustrup dice acerca de por qué se introdujo using en lugar de ampliar typedef:

    La palabra clave utilizando se utiliza para obtener un lineales notación «nombre seguido por
    lo que se refiere.» Hemos intentado con el convencional y complicada
    typedef solución, pero nunca se las arregló para obtener una completa y coherente
    la solución, hasta que nos decidimos por una menos oscuro de la sintaxis.

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

    Además de ser importante en relación con las plantillas, tipo de
    los alias también puede ser utilizado como una diferente (y de la OMI mejor) la sintaxis para
    tipo ordinario alias:

    using PF = void (*)(double);

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

    typedef void(*PF)(double);

    Aquí es un explicación (ver página 4) a partir de su propuesta, que es aún más profundo:

    Se ha sugerido que la (re)utilización de la palabra clave typedef — como se ha hecho en el
    documento [4] — la introducción de la plantilla alias:

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

    Que la notación tiene la ventaja de usar una palabra clave, ya conocido por 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 tipo de nombre en un contexto en el que el alias no designa a un tipo, pero una plantilla; Vec es no un alias para un tipo, y no debe ser tomado por un typedef-nombre. El nombre Vec es un nombre para la familia std::vector<*,MyAllocator<*>> – donde el asterisco es un marcador de posición para un tipo de nombre.
    En consecuencia, no nos proponemos el «typedef» sintaxis.

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

    se puede leer/interpretar como: a partir de ahora, voy a estar usando Vect<T> como sinónimo de std::vector<T,MyAllocator<T>>. Con la lectura, la nueva sintaxis para asignar un alias parece razonablemente lógico.

    Por lo que tiene, básicamente, dos puntos aquí:

    1. Un using plantilla se convierte en una familia de tipos, no un tipo, por lo que typedef está «mal»
    2. using puede ser leído casi como un enunciado en inglés
    • Estoy de acuerdo con él en ese último punto… yo diría que using debe venido a sustituir a las definiciones de tipos. La sintaxis es mucho menos ambiguo.
    • Sólo por comparación, que tal vez debería mostrar lo que un typedef sería como para su void(*)(double) ejemplo. 🙂
    • Buena idea, gracias.
    • Sobre el punto 1, el mismo podría haberse dicho de clase o struct, no sólo de typedef.
    • Siempre se preguntó por qué nunca permitió que el simple hecho de tener typedef void(*)(double) PF; Habría sido (casi) tan claro como using. Plantilla de typedefs – bien, yould han trabajado, se habría acostumbrado a la misma como puntero de la función de las definiciones de tipos… de Vuelta a los punteros a función, en realidad, me siento igual cuando la definición de variables: ¿por Qué no int(*)(double) callback;? Yo sé, la filosofía en el fin es el mismo que con char *a, b, *c;. Una cosa que yo puede leer, pero nunca amigo y nunca lo uso yo en el código como mi lectura personal es diferente…

Dejar respuesta

Please enter your comment!
Please enter your name here