Почему не делает участников структуры разбора sizeof?

Я знаю это sizeof вычисление времени компиляции, но это кажется странным мне: компилятор может взять или имя типа или выражение (из которого он выводит тип). Но как Вы определяете тип в классе? Кажется, что единственный путь состоит в том, чтобы передать выражение, которое кажется довольно неуклюжим.

struct X { int x; };
int main() {
    // return sizeof(X::x); // doesn't work
    return sizeof(X()::x); // works, and requires X to be default-constructible
}
17
задан Tom 25 January 2010 в 00:20
поделиться

3 ответа

Альтернативный метод работает без использования конструктора по умолчанию:

return sizeof(((X *)0)->x);

Можно обернуть его в макрос, чтобы он лучше читался:

#define member_sizeof(T,F) sizeof(((T *)0)->F)
27
ответ дан 30 November 2019 в 11:44
поделиться

Вот решение без неприятного нулевого указателя размытия;)

struct X { int x; };

template<class T> T make(); // note it's only a declaration

int main()
{
    std::cout << sizeof(make<X>().x) << std::endl;
}
10
ответ дан 30 November 2019 в 11:44
поделиться

А как же смещение ? Посмотрите здесь . Также посмотрите здесь , который сочетает в себе как размер , так и смещение в макросе.

Надеюсь, это поможет.

0
ответ дан 30 November 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: