Какая логика стоит за ключевым словом «using» в C ++?
Он используется в разных ситуациях, и я пытаюсь выяснить, есть ли у них что-то общее, и есть причина, по которой ключевое слово «using» используется как таковое.
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;
. Было бы еще хуже, если бы код C ++ внезапно перестал быть действительным C ++.int class;
не будет компилироваться как C ++, не совсем плохая вещь. Его можно использовать для гарантии того, что код C будет скомпилирован как C. Слишком легко забыть, что C и C ++ - это два разных языка - и, фактически, есть код, который является допустимым C и допустимым C ++, но с другой семантикой.using
не хуже (или лучше), чемstatic
. ИМХО, смысл не вводить новые ключевые слова очень важен, поскольку, как объясняют интернет-специалисты, сделан из catz и Ben Voigt.Ответы:
В C ++ 11
using
ключевое слово при использовании дляtype alias
идентичноtypedef
.7.1.3.2
Бьярне Страуструп дает практический пример:
До C ++ 11
using
ключевое слово может привести функции-члены в область видимости. В C ++ 11 теперь вы можете сделать это для конструкторов (другой пример Бьярна Страуструпа):Бен Войт приводит довольно вескую причину отказа от введения нового ключевого слова или нового синтаксиса. Стандарт хочет как можно больше не ломать старый код. Вот почему в предложении документов вы увидите разделы нравится
Impact on the Standard
,Design decisions
и как они могут повлиять на старый код. Бывают ситуации, когда предложение кажется действительно хорошей идеей, но может не иметь тяги, потому что его будет слишком сложно реализовать, слишком запутанно или будет противоречить старому коду.Вот старая статья 2003 года №1449 . Похоже, обоснование связано с шаблонами. Предупреждение: возможны опечатки из-за копирования из PDF.
В последующей статье n1489 объясняется, почему
using
вместо использованияtypedef
:Я думаю, что здесь проводится важное различие, псевдоним es вместо типа s. Еще одна цитата из того же документа:
Резюме, на роль
using
:namespace PO = boost::program_options
иusing PO = ...
эквивалентные)A typedef declaration can be viewed as a special case of non-template alias-declaration
. Это эстетическое изменение, и в этом случае оно считается идентичным.namespace std
в глобальную область видимости), функции-члены, наследующие конструкторыЕго нельзя использовать для:
Вместо этого сделайте:
Называя набор перегрузок.
источник
using P = [](double)->void;
есть, AFAIK, недействительно C ++ 11. Это, однако,:using P = auto(double)->void;
и создает тип функции (такойP*
как указатель на функцию).register
не звучит так плохо, в:register X as Y
register
начинается объявление переменной, так что это уже имеет значение. Объявите переменную регистра с именем Y типа X.