Sé que en C ++ 11 ahora podemos usar usingpara escribir alias de tipo, como typedefs:
typedef int MyInt;
Es, por lo que entiendo, equivalente a:
using MyInt = int;
Y esa nueva sintaxis surgió del esfuerzo por tener una forma de expresar " template typedef":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Pero, con los dos primeros ejemplos que no son de plantilla, ¿hay otras diferencias sutiles en el estándar? Por ejemplo, typedefs aliasing de una manera "débil". Es decir, no crea un nuevo tipo, sino solo un nuevo nombre (las conversiones están implícitas entre esos nombres).
¿Es lo mismo con usingo genera un nuevo tipo? ¿Hay alguna diferencia?
c++
c++11
typedef
using-declaration
Klaim
fuente
fuente

typedef void (&MyFunc)(int,int);ousing MyFunc = void(int,int);?typedef void MyFunc(int,int);(que en realidad no se ve tan mal), ousing MyFunc = void(&)(int,int);using MyFunc = void(&)(int,int);?MyFuncQué significa es una referencia a una función? ¿Qué pasa si omite el & ?typedef void (&MyFunc)(int,int);. Si omite el&es equivalente atypedef void MyFunc(int,int);Respuestas:
Son equivalentes, del estándar (énfasis mío) (7.1.3.2):
fuente
usingpalabra clave parece ser un superconjunto detypedef. Entonces, serátypdefobsoleto en el futuro?usingsintaxis precisamente porque latypedefsemántica no funcionaba bien con las plantillas. Lo que de alguna manera contradice el hecho de queusingse define para tener exactamente la misma semántica.n1489. Un alias de plantilla no es un alias para un tipo, sino un alias para un grupo de plantillas. Hacer una distinción entretypedefel sentido de la necesidad de una nueva sintaxis. Además, tenga en cuenta que la pregunta del OP es acerca de la diferencia entre las versiones sin plantilla.typdefser desaprobado nunca.Son en gran medida iguales, excepto que:
fuente
typedefsi puedo preguntar?El uso de la sintaxis tiene una ventaja cuando se usa dentro de plantillas. Si necesita la abstracción de tipo, pero también necesita mantener el parámetro de plantilla para poder especificarlo en el futuro. Deberías escribir algo como esto.
Pero el uso de la sintaxis simplifica este caso de uso.
fuente
Son esencialmente lo mismo, pero
usingproporciona loalias templatesque es bastante útil. Un buen ejemplo que pude encontrar es el siguiente:Entonces, podemos usar en
std::add_const_t<T>lugar detypename std::add_const<T>::typefuente
Sé que el póster original tiene una gran respuesta, pero para cualquiera que se encuentre con este hilo como yo, hay una nota importante de la propuesta que creo que agrega algo de valor a la discusión aquí, particularmente a las preocupaciones en los comentarios sobre si la
typedefpalabra clave es se marcará como obsoleto en el futuro o se eliminará por ser redundante / antiguo:Para mí, esto implica un soporte continuo para la
typedefpalabra clave en C ++ porque aún puede hacer que el código sea más legible y comprensible .La actualización de la
usingpalabra clave fue específicamente para plantillas, y (como se señaló en la respuesta aceptada) cuando se trabaja con no plantillasusingytypedefson mecánicamente idénticas, por lo que la elección depende totalmente del programador por motivos de legibilidad y comunicación de intenciones. .fuente
Ambas palabras clave son equivalentes, pero hay algunas advertencias. Una es que declarar un puntero de función con
using T = int (*)(int, int);es más claro que contypedef int (*T)(int, int);. En segundo lugar, esa forma de alias de plantilla no es posible contypedef. En tercer lugar, exponer C API requeriríatypedefen encabezados públicos.fuente
Las declaraciones de typedef pueden, mientras que las declaraciones de alias no pueden, usarse como declaraciones de inicialización
Aunque sea un caso de esquina, una declaración typedef es una instrucción init y, por lo tanto, se puede usar en contextos que permiten instrucciones de inicialización
mientras que una declaración de alias no es una instrucción init y , por lo tanto, no puede usarse en contextos que permitan instrucciones de inicialización
fuente