Стандарты анонимных структур? И, действительно, что это * они?

MSDN считает, что анонимные структуры не являются стандартными в C ++:

Расширение Microsoft C позволяет объявлять структурную переменную в другой структуре без указания имени. Эти вложенные структуры называются анонимными структурами. C ++ не позволяет анонимные структуры.

Вы можете получить доступ к членам анонимной структуры, как если бы они были членами в содержащей структуре.

@ K-ballo соглашается .

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

C ++ 11 говорит:

[C++11: 9/1] : [..] Спецификатор classа, чей class-руководитель опускает имя classа-head, определяет неназванный class.

и предоставляет целую грамматическую конструкцию для определения типа без имени.

C ++ 03 не имеет этой явной формулировки, но аналогичным образом указывает, что identifier в определении типа является необязательным и ссылается на «неназванные classы» в 9.4.2/5 и 3.5/4 .

  • Так MSDN ошибается, и все это полностью стандартно?
  • Или есть какая-то тонкость, которую я пропускаю между «неназванными структурами / classами» и тем же, когда они используются в качестве членов, которые мешают им быть охвачены этой функциональностью C ++ 03 / C ++ 11?
  • Не хватает ли я принципиальной разницы между «неназванной структурой» и «анонимной структурой»? Они похожи на синонимы.

Весь стандартный текст относится к созданию «неназванной структуры»:

 struct { int hi; int bye; }; 

Просто приятный дружелюбный тип, без доступного имени.

Стандартным способом он может быть создан как член:

 struct Foo { struct { int hi; int bye; } bar; }; int main() { Foo f; f.bar.hi = 3; } 

Но «анонимная структура» тонко отличается – это комбинация «неназванной структуры» и тот факт, что вы волшебным образом получаете членов из этого в родительском объекте:

 struct Foo { struct { int hi; int bye; }; // <--- no member name! }; int main() { Foo f; f.hi = 3; } 

Обращаясь к интуиции , это не просто создает неназванную структуру, вложенную witin Foo , но также автоматически дает вам «анонимный член», который делает члены доступными в родительском объекте.

Эта функциональность нестандартна. GCC поддерживает его , а также Visual C ++. Заголовки API Windows используют эту функцию по умолчанию, но вы можете указать, что вы ее не хотите, добавив #define NONAMELESSUNION перед включением файлов заголовков Windows.

Сравните со стандартной функциональностью «анонимных союзов», которые делают аналогичную вещь:

 struct Foo { union { int hi; int bye; }; // <--- no member name! }; int main() { Foo f; f.hi = 3; } 

Похоже, что хотя термин «неназванный» относится к типу (то есть «classу» или «структуре»), термин «анонимный» относится вместо этого к фактическому экземпляру-члену (используя более старое значение «struct» «это ближе к« объекту некоторого struct y type »). Вероятно, это был корень вашей первоначальной путаницы.

То, что Microsoft называет анонимными структурами, не является стандартным. Неименованная структура – это просто обычная структура, которая не имеет имени. С ним мало что можно сделать, если вы также не определяете объект такого типа:

 struct { int i; double d; } my_object; my_object.d = 2.3; 

Анонимные профсоюзы являются частью стандарта, и у них есть поведение, которое вы ожидаете от чтения описания Microsoft своих анонимных структур:

 union { int i; double d; }; d = 2.3; 

Стандарт говорит об анонимных профсоюзах : [9.5] / 5

Объединение формы

 union { member-specification } ; 

называется анонимным союзом; он определяет неназванный объект неназванного типа. Спецификация участника анонимного объединения должна определять только нестатические элементы данных. [Примечание. Вложенные типы и функции не могут быть объявлены в анонимном объединении. -End note] Имена членов анонимного союза должны отличаться от имен любого другого объекта в области, в которой объявлен анонимный союз. Для целей поиска имени после определения анонимного объединения члены анонимного объединения считаются определенными в области, в которой объявлен анонимный союз. [ Пример:

 void f() { union { int a; const char* p; }; a = 1; p = "Jennifer"; } 

Здесь a и p используются как обычные (неявные) переменные, но поскольку они являются членами объединения, они имеют одинаковый адрес. -End пример]

Анонимные структуры , о которых говорит Microsoft, являются этой функцией для unions но применяются к structs . Это не просто неназванное определение, важно отметить, что элементы анонимного объединения / структуры считаются определенными в области, в которой объявлен анонимный union / struct.

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

  • Файл Makefile с несколькими исполняемыми файлами
  • Разница между A * pA = новая A; и A * pA = новый A ();
  • Независимо от платформы size_t Спецификаторы формата в c?
  • Что делает MaxDegreeOfParallelism?
  • Почему C-массив имеет неправильное значение sizeof (), когда он передается функции?
  • Как получить HTML-вывод UserControl в .NET (C #)?
  • Переполнение Unsigned Int
  • Почему C # (4.0) не допускает совпадения и контравариантность в типах универсального classа?
  • Быстрый метод для округления двойного до 32-битного int
  • C / C ++ проверить, установлен ли один бит, т. Е. Переменная int
  • Можно ли зафиксировать отношения от 0..1 до 0..1 в Entity Framework?
  • Interesting Posts

    Недопустимый сетевой диск с моим компьютером и проводником

    Как редактировать текстовые файлы в командной строке Windows?

    Как создать меню asp.net с помощью CSS

    Может ли приложение phonegap работать в фоновом режиме?

    Использование Reshape с широким и длинным в R

    Другой повторяющийся столбец при сопоставлении ошибки сущности

    Ярлыки или пузыри Android в EditText

    Как проиндексировать PDF-файл в Elasticsearch 5.0.0 с помощью плагина ingest-attachment?

    Редактируйте pdf, встроенный в браузер, и сохраните pdf прямо на сервере

    Изменение макета слайдов по умолчанию в Powerpoint

    Динамический заголовок JQuery Mobile 1.4.1

    Почему удаляет огромное количество файлов (в среднем малый размер) дольше, чем один файл (огромный размер)

    Агрегация перекрывающихся группировок в сводной таблице

    Как отключить защиту файлов Windows в Windows XP или 7 из реестра?

    Команда не найдена при использовании sudo

    Давайте будем гением компьютера.