Почему класс с несколькими спецификаторами открытого доступа standard_layout?

Я просто играл с g ++ и обнаружил, что

#include <type_traits>

class Foo {
public: int x;
public: char y;
public: double z;
};

static_assert(std::is_standard_layout<Foo>::value, "Foo is not standard layout");

int main() {}

Компилирует просто отлично.

В соответствии с этот ответ, data members across access specifiers may be reordered in memory, Так что нет гарантии, что x должен быть на самом деле первым членом Foo когда на самом деле выложены в памяти. Как я определил Foo, y может быть первым элементом правильно?

Я думал, что стандартное расположение означает, что вы можете более или менее понять, как расположены байты для данного типа. Позволить произвольно переупорядочивать поля в стандартном типе макета мне кажется нелогичным. Почему это разрешено?

0

Решение

Все члены вашей структуры имеют одинаковый спецификатор доступа: public, Тот факт, что ключевое слово появляется перед каждым учеником, не имеет значения. Это эквивалентно public спецификатор доступа появляется один раз, перед всеми членами класса.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]