Я предполагаю, что ключевое слово даже не попало бы в язык, если бы не совместимость с Си. Хотя я не могу говорить с какими-либо полномочиями, если это так, мне кажется, есть практическая причина, по которой он должен быть легальным, за исключением простого применения стандарта «компилятор умнее вас»: C ++ принимает адреса вещей без разрешение с большей готовностью, чем С. В частности: функции-члены и ссылки.
Поскольку функции-члены требуют неявного параметра this
, было бы невозможно вызвать их из объекта, объявленного register
. В C нет ничего, что запрещало бы вам говорить register struct X x;
, поэтому такой язык должен быть разрешен в C ++ [поскольку C-совместимость - это единственная причина, по которой ключевое слово вообще существует]. Но если вы запрещаете вызывать функции-члены, а также принимать адреса, это также охватывает начальный вызов конструктора. По сути, это не будет работать на не POD-типах. Таким образом, вы получите один спецификатор класса хранения, который действителен только для небольшого подмножества допустимых типов, когда все остальное можно использовать для чего угодно.
Вы также не можете создавать ссылки на такие объекты, хотя технически компилятор не должен обрабатывать ссылки как указатели. register int i; int& x;
не обязательно иметь пробел для двух переменных, но если вы позже сделаете &x
, вы получите указатель на i
. Таким образом, первоначальная конструкция должна быть признана незаконной. Хотя это кажется несущественным, поскольку ссылки в любом случае не существуют в C, возвращаясь к нашему предыдущему пункту, типы POD, объявленные со спецификатором register
, больше не могут копироваться. Предоставленный компилятором конструктор копирования имеет форму X::X(const X&)
или X::X(X&)
в зависимости от ситуации.
Таким образом, чтобы поддерживать совместимость с C, они должны сделать register
уникальным в качестве спецификатора класса хранения, поскольку он не применим ко всем типам, и изменить как минимум две разные части стандарта в другом месте [чтобы указать, что Вы не можете создать ссылку на переменную, объявленную с помощью спецификатора register
, и как-то обойти ссылки для копирования POD]. Или они могут просто сказать «все в порядке, чтобы взять адрес» и позволить компиляторам решать, удовлетворять запросы или нет. Что-то, что они планировали делать так или иначе.