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, или я неправильно читаю стандарт?
Ответы
Ответ 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