Eu sei que no C ++ 11 agora podemos usar using
para escrever alias de tipo, como typedef
s:
typedef int MyInt;
É, pelo que entendi, equivalente a:
using MyInt = int;
E essa nova sintaxe surgiu do esforço de ter uma maneira de expressar " template typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Mas, com os dois primeiros exemplos não-modelo, existem outras diferenças sutis no padrão? Por exemplo, typedef
s faz alias de maneira "fraca". Ou seja, ele não cria um novo tipo, mas apenas um novo nome (as conversões estão implícitas entre esses nomes).
É o mesmo com using
ou gera um novo tipo? Existem diferenças?
c++
c++11
typedef
using-declaration
Klaim
fonte
fonte
typedef void (&MyFunc)(int,int);
ouusing MyFunc = void(int,int);
?typedef void MyFunc(int,int);
(que na verdade não parece tão ruim), ouusing MyFunc = void(&)(int,int);
using MyFunc = void(&)(int,int);
? significa queMyFunc
é uma referência a uma função? e se você omitir o & ?typedef void (&MyFunc)(int,int);
. Se você omitir o&
equivalente atypedef void MyFunc(int,int);
Respostas:
Eles são equivalentes, do padrão (ênfase minha) (7.1.3.2):
fonte
using
palavra-chave parece ser um superconjunto detypedef
. Então, serátypdef
preterido no futuro?using
sintaxe precisamente porque atypedef
semântica não funcionou bem com modelos. O que de alguma forma contradiz o fato de queusing
é definido como tendo exatamente a mesma semântica.n1489
. Um alias de modelo não é um alias para um tipo, mas um alias para um grupo de modelos. Fazer uma distinção entretypedef
a necessidade de uma nova sintaxe. Além disso, lembre-se de que a pergunta do OP é sobre a diferença entre versões que não são modelos.typdef
ser preterido.Eles são basicamente os mesmos, exceto que:
fonte
typedef
se eu perguntar?A sintaxe de uso tem uma vantagem quando usada em modelos. Se você precisar do tipo abstração, mas também precisar manter o parâmetro do modelo para poder ser especificado no futuro. Você deve escrever algo assim.
Mas o uso da sintaxe simplifica esse caso de uso.
fonte
Eles são essencialmente os mesmos, mas
using
fornece oalias templates
que é bastante útil. Um bom exemplo que pude encontrar é o seguinte:Então, podemos usar em
std::add_const_t<T>
vez detypename std::add_const<T>::type
fonte
Sei que o pôster original tem uma ótima resposta, mas para qualquer um que tropeçar nesse tópico como eu, há uma nota importante da proposta que, em minha opinião, agrega algo de valor à discussão aqui, principalmente às preocupações nos comentários sobre se a
typedef
palavra-chave é será marcado como obsoleto no futuro ou removido por ser redundante / antigo:Para mim, isso implica suporte contínuo para a
typedef
palavra - chave em C ++, pois ainda pode tornar o código mais legível e compreensível .A atualização da
using
palavra - chave foi especificamente para modelos e (como indicado na resposta aceita) quando você trabalha com não modelosusing
etypedef
é mecanicamente idêntico, portanto, a escolha depende totalmente do programador com base na legibilidade e na comunicação da intenção. .fonte
Ambas as palavras-chave são equivalentes, mas existem algumas ressalvas. Uma é que declarar um ponteiro de função com
using T = int (*)(int, int);
é mais claro do que comtypedef int (*T)(int, int);
. O segundo é que o formulário de alias de modelo não é possível comtypedef
. Terceiro, é necessário expor a API Ctypedef
em cabeçalhos públicos.fonte
As declarações Typedef podem, enquanto as declarações de alias não, podem ser usadas como instruções de inicialização
Embora seja um caso de canto, uma declaração typedef é uma instrução init e, portanto, pode ser usada em contextos que permitem instruções de inicialização
Considerando que uma declaração de alias não é uma instrução init e , portanto, não pode ser usada em contextos que permitem instruções de inicialização
fonte