Qual é a lógica por trás da palavra-chave "using" em C ++?
É usado em diferentes situações e estou tentando descobrir se todos têm algo em comum e há uma razão pela qual a palavra-chave "using" é usada como tal.
using namespace std; // to import namespace in the current namespace
using T = int; // type alias
using SuperClass::X; // using super class methods in derived class
int class;
. Seria ainda pior se o código C ++ de repente parasse de ser válido em C ++.int class;
não ser compilado como C ++ não é totalmente ruim. Ele pode ser usado para garantir que o código C seja compilado como C. É muito fácil esquecer que C e C ++ são duas linguagens diferentes - e, na prática, existe um código que é C e C ++ válidos, mas com semânticas diferentes.using
não é pior (ou melhor) questatic
. IMHO, o ponto de não introduzir novas palavras-chave é muito importante, conforme explicado pelas páginas internas: catz e Ben Voigt.Respostas:
No C ++ 11, a
using
palavra - chave quando usada paratype alias
é idêntica atypedef
.7.1.3.2
Bjarne Stroustrup fornece um exemplo prático:
Antes do C ++ 11, a
using
palavra - chave pode colocar funções de membro no escopo. No C ++ 11, agora você pode fazer isso para construtores (outro exemplo de Bjarne Stroustrup):Ben Voight fornece uma boa razão por trás da lógica de não introduzir uma nova palavra-chave ou nova sintaxe. O padrão quer evitar a quebra de código antigo, tanto quanto possível. É por isso que nos documentos da proposta você vai ver secções gosta
Impact on the Standard
,Design decisions
e como elas podem afetar código antigo. Há situações em que uma proposta parece realmente uma boa idéia, mas pode não ter tração, porque seria muito difícil de implementar, muito confuso ou contradizia o código antigo.Aqui está um artigo antigo de 2003 n1449 . A lógica parece estar relacionada aos modelos. Aviso: pode haver erros de digitação devido à cópia do PDF.
O documento de acompanhamento n1489 explica por que, em
using
vez de usartypedef
:Eu acho que a distinção importante é feita aqui, aliás es em vez de tipos s. Outra citação do mesmo documento:
Resumo, para o papel de
using
:namespace PO = boost::program_options
eusing PO = ...
equivalente)A typedef declaration can be viewed as a special case of non-template alias-declaration
. É uma mudança estética e é considerada idêntica neste caso.namespace std
para o escopo global), funções-membro, herdar construtoresNão pode ser utilizado para:
Em vez disso, faça:
Nomeando um conjunto de sobrecargas.
fonte
using P = [](double)->void;
é, AFAIK, C ++ 11 inválido. No entanto, isso é:using P = auto(double)->void;
e produz um tipo de função (comoP*
um ponteiro de função).register
, não soaria tão ruim, está em:register X as Y
register
inicia uma declaração de variável, portanto isso já tem um significado. Declare uma variável de registro chamada Y do tipo X.