Подтвердить что ты не робот

Clang и GCC принимают сомнительный размер

У меня есть компиляторы, которые не согласны с sizeof. Для следующего кода Clang и GCC будут скомпилировать его, но другие компиляторы, которые я должен использовать, не могут утверждать "незаконный размер операнда". Мое чтение стандарта говорит, что это незаконно, поскольку sizeof может принимать только выражение (я не думаю, что S:: a является выражением) или идентификатор типа, но для GCC и Clang это необычно для обоих быть неправым. Я могу, очевидно, заменить его на sizeof(S().a), который работает со всеми моими компиляторами.

struct S
{
   int a[32];
   int b;
   int c;
   int d[32];
};

int main()
{
   return sizeof(S::a);
}

Ошибочны ли Кланг и GCC, или я неправильно читаю стандарт?

4b9b3361

Ответ 1

§ 5.1.1 [expr.prim.general] 13

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

- как часть доступа члена класса (5.2.5), в котором выражение объекта ссылается на класс участников [63] или класс, полученный из этого класса, или

- для формирования указателя на элемент (5.3.1) или

- если это id-выражение обозначает нестатический элемент данных и появляется в неоцененном операнде [Пример:

struct S {
    int m;
};

int i = sizeof(S::m);      // OK
int j = sizeof(S::m + 42); // OK

-end пример]

Изменить: Как отмечает @Praetorian в комментариях к самому вопросу: это было представлено в С++ 11