На эти вопросы невозможно ответить без дополнительных разъяснений.Вопрос помечен C ++, что означает, что язык предположительно C ++.
В этом случае, если объявления сделаны в области имен, объявление ix
недопустимо.Недопустимо использовать безымянный тип класса (у которого нет связи) для объявления объекта с внешней связью.Объявление ix
будет работать в локальной области действия
void foo() {
struct { int x; } ix; // OK, no linkage
}
Это также может работать, если ix
было объявлено с внутренней связью в области имен
static struct { int x; } ix; // OK? Internal linkage?
, хотя я лично считаю, чтоэто также должно было быть неправильно сформировано (Comeau каким-то образом это позволяет).
Но объявление области пространства имен с внешней связью некорректно
// In namespace scope
struct { int x; } ix; // ERROR
Так что, если пространство именподразумевается область действия, и если вышеуказанные объявления должны восприниматься как единый фрагмент кода, на эти вопросы нет значимых ответов.Весь код просто недействителен.Это бессмысленно.Это не C ++.
В противном случае, если ix
объявлено без связи (локальной) или с внутренней связью, тогда ix
является объектом.
Что касается ia
,это объект независимо от того, где он объявлен, поскольку тип класса с именем .
Обратите внимание, что понятие object в C ++ не имеет ничего общего склассы.Объект в C ++ является областью хранения (памяти).Переменная типа int
- это объект в C ++, например.
Добавлено позже: Немного о легальности объявления ix
- интересная проблема.Очевидно, C ++ 98 допускал такие декларации, что было предложено объявить вне закона в DR # 132 .Однако позже предложение было отклонено (по довольно странной причине), и все осталось как есть.Тем не менее, Comeau Online отказывается принять объявление объекта с внешней связью безымянного типа (внутренняя связь в порядке).Вполне возможно, что это может быть формальная ошибка в компиляторе Comeau (не то, чтобы я жаловался на это).
Добавлено даже позже: О, я вижу, что есть даже позже DR # 389 , который в конечном итоге запрещает такие заявления, но статус этого DR по-прежнему CD1.