Почему псевдонимы типов в С++ используют "использование" вместо "typedef" в их синтаксисе?

Очевидно, что псевдонимы типов и шаблонные псевдонимы типов семантически эквивалентны typedefs и расширению typedef для поддержки шаблона. Почему новый синтаксис с ключевым словом using был создан для них вместо использования typedefs для первого и некоторого расширения синтаксиса со словом typedef.

ПРИМЕЧАНИЕ. Это не клон вопроса "разница между использованием и typedef". Я знаю, что using дает преимущество определения семейства typedef s. Я спрашиваю, почему стандартные люди решили, что это расширение использует ключевое слово using вместо ключевого слова typedef. Кажется, это просто добавляет путаницу в язык.

Ответ 1

То, что вы предлагаете, было предложено еще в 2002 году в документе N1406 Herb Sutter. Это позволило бы, например, написать:

template<typename T> typedef X<T,int> Xi; 

Это было позже пересмотрено в N1449 Габриэлем Досом Рейсом и Матом Маркусом. Они принимают синтаксис using и отмечают следующее:

Обратите внимание, что мы специально избегаем термина "шаблон typedef" и вводим новый синтаксис, включающий пару "using" и "=", чтобы избежать путаницы: мы не определяем какие-либо типы здесь, мы вводим синоним (т.е. псевдоним ) для абстракции идентификатора типа (т.е. выражения типа), включающего параметры шаблона.

Они также указывают:

В отношении синтаксиса были приняты два соломенных опроса. Сильное большинство голосовало, чтобы избежать синтаксиса шаблона typedef, в пользу синтаксиса "=". Второе голосование указывало на сильное предпочтение ключевому слову "использование", а не на слово "псевдоним" или отсутствие какого-либо ключевого слова, как в проекте версии этого предложения. Мотивация использования какого-либо ключевого слова была частично обусловлена ​​желанием использовать синтаксис, который мог бы быть совместим с ненавязчивым наложением псевдонимов, кратко описанным выше.

Этот синтаксис был затем принят в окончательном предложении N2258 Габриэлем Досом Рейсом и Бьярном Страуступом.

Ответ 2

Вот что Bjarne Stroustrup говорит о том, почему они ввели using вместо расширения typedef:

Использование ключевого слова используется для получения линейного обозначения "имя, за которым следует к чему это относится". Мы попытались с обычным и запутанным typedef, но так и не удалось получить полный и последовательный до тех пор, пока мы не остановимся на менее неясном синтаксисе.

Он также утверждает, что ему больше нравится этот синтаксис для обычных typedefs:

Помимо важности в связи с шаблонами, введите псевдонимы могут также использоваться в качестве другого (и лучшего ИМО) синтаксиса для псевдонимы обычного типа:

using PF = void (*)(double);

Он здесь совершенно прав, это кажется очень чистым. Напротив, typedef был бы чрезвычайно запутан с именем, находящимся где-то посередине:

typedef void(*PF)(double);

Вот описание (см. стр. 4) из их предложения, которое еще более подробно:

Было предложено (повторно) использовать ключевое слово typedef - как это сделано в [4] - ввести шаблонные псевдонимы:

template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;

Эта нотация имеет то преимущество, что использует ключевое слово, которое уже известно, чтобы ввести псевдоним типа. Тем не менее, он также отображает несколько недостатков, среди которых путаница использования ключевого слова, известного для введения псевдонима для имени типа в контексте, где псевдоним не обозначает тип, а шаблон; Vec является не псевдоним для типа и не должен использоваться для typedef-name. Имя Vec - это имя для семейства std::vector<*,MyAllocator<*>> - где звездочка является заполнителем для имени типа. Следовательно, мы не предлагаем синтаксис typedef.

template<class T>
using Vec = std::vector<T,MyAllocator<T>>;

можно прочитать/интерпретировать как: с этого момента я буду использовать Vect<T> как синоним для std::vector<T,MyAllocator<T>>. С этим чтением новый синтаксис для псевдонимов кажется достаточно логичным.

Итак, у него есть в основном два момента:

  • Шаблон using становится семейством типов, а не типом, поэтому typedef является "неправильным".
  • using можно прочитать почти как английское предложение