Sé que en C ++ 11 ahora podemos usar using
para escribir alias de tipo, como typedef
s:
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, typedef
s 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 using
o 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);
?MyFunc
Qué 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
using
palabra clave parece ser un superconjunto detypedef
. Entonces, serátypdef
obsoleto en el futuro?using
sintaxis precisamente porque latypedef
semántica no funcionaba bien con las plantillas. Lo que de alguna manera contradice el hecho de queusing
se 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 entretypedef
el 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.typdef
ser desaprobado nunca.Son en gran medida iguales, excepto que:
fuente
typedef
si 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
using
proporciona loalias templates
que 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>::type
fuente
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
typedef
palabra 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
typedef
palabra clave en C ++ porque aún puede hacer que el código sea más legible y comprensible .La actualización de la
using
palabra clave fue específicamente para plantillas, y (como se señaló en la respuesta aceptada) cuando se trabaja con no plantillasusing
ytypedef
son 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íatypedef
en 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