Nano Hash - криптовалюты, майнинг, программирование

Почему объявление псевдонима не является допустимым оператором инициализации (/ простое объявление)?

Объявления Typedef могут, в то время как объявления псевдонимов, использоваться в качестве операторов инициализации?

грамматика для инструкции инициализации для C ++ 17 выглядит следующим образом:

init-заявление:

выражение-заявление:

  • expression_opt;

простое объявление:

  • объявление-спецификатор-последовательность инициализации-декларатора-списка_опт;
  • атрибут-спецификатор-последовательность-декларант-спецификатор-последовательность-инициализации-декларатора-список;
  • атрибут-спецификатор-seq_opt декларация-спецификатор-последовательность ref-qualifier_opt [список-идентификаторов] инициализатор;

[...]

Может быть объявление typedef используется как init-statement, и, например, следующий допустимый код (C ++ 17):

if (typedef int Foo; true) { (void)Foo{}; }
//  ^^^^^^^^^^^^^^^ init-statement

switch(typedef int Foo; 0) { case 0: (void)Foo{}; }
//     ^^^^^^^^^^^^^^^ init-statement

тогда как объявление-псевдонима нельзя использовать в качестве инструкции инициализации:

if (using Foo = int; true) { (void)Foo{}; }
//  ^^^^^^^^^^^^^^^ error: expected expression

switch(using Foo = int; 0) { case 0: (void)Foo{}; }
//     ^^^^^^^^^^^^^^^ error: expected expression

Afaics объявление typedef является допустимым простым-объявлением, поскольку typedef является decl-спецификатор, который является частью decl-specified-seq, который, в свою очередь, сам по себе является действительным простая-декларация, тогда как < em> объявление-псевдонима - это совершенно другое объявление, а не простое-объявление.

Как и ответы в В чем разница между 'typedef 'и' using 'в C ++ 11?, у меня всегда было впечатление, что объявления псевдонимов имеют ту же семантику, что и объявления typedef, и никогда не отстают от них, но, как видно из приведенных выше примеров (начиная с C ++ 17?), В случаях использования, ограниченных простым-объявлением: s, особенно операторами инициализации C ++ 17 (init-statement: s).

Вопрос:

  • Действительно ли объявление typedef является действительным init-statement / простым-объявлением, тогда как объявление псевдонима - нет? Является ли это намеренным «отклонением» от C ++ 17 w.r.t. предыдущая (почти -?) идентичная семантика этих двух типов объявлений?

  • Я не уверен, что мы можем назвать семантику прежней. for(typedef int Foo ; ;) действителен, начиная с C ++ 03, но объявление псевдонима также никогда не было действительным в этом месте. Это то же самое. Честно говоря, я думаю, что это просто не то, о чем кто-то когда-либо беспокоился, или подумал, что это должно быть эквивалентно. 03.06.2020
  • @ StoryTeller-UnslanderMonica А, это правда (начиная с C ++ 11, поскольку у нас было только объявление typedef в C ++ 03). Может быть, это так просто; неважный угловой случай. Однако я никогда не рассматривал возможность использования объявления typedef в выражении for(...), тогда как использование typedef в выражении инициализации, например, if утверждения, возможно (или нет? :)) могут пригодиться в некоторых ситуациях. 03.06.2020

Ответы:


1

Действительно ли это факт, что объявление typedef является допустимым оператором инициализации / простым объявлением, тогда как объявление псевдонима не является

Да, объявление typedef является допустимым оператором инициализации, а объявление псевдонима - нет.

Является ли это намеренным «отклонением» от C ++ 17 w.r.t. предыдущая (почти -?) идентичная семантика этих двух типов объявлений?

Как указано в комментарии @ StoryTeller, это было не только в случае расширенных контекстов init-statement: s в C ++ 17 (добавление их, например, в операторы if и switch), но уже присутствующих, поскольку C + +03 и разница между объявлениями typedef и объявлениями псевдонимов с начала введения объявлений псевдонимов в C ++ 11:

// C++11 (C++03) (init. statement in for loop iteration statements).
for(typedef int Foo; Foo{} != 0;) {}
//  ^^^^^^^^^^^^^^^ init-statement

// C++ 11.
for(using Foo = int; Foo{} != 0;) {}
//  ^^^^^^^^^^^^^^^ error: expected expression
04.06.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..