Я просто играл с 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
может быть первым элементом правильно?
Я думал, что стандартное расположение означает, что вы можете более или менее понять, как расположены байты для данного типа. Позволить произвольно переупорядочивать поля в стандартном типе макета мне кажется нелогичным. Почему это разрешено?
Все члены вашей структуры имеют одинаковый спецификатор доступа: public
, Тот факт, что ключевое слово появляется перед каждым учеником, не имеет значения. Это эквивалентно public
спецификатор доступа появляется один раз, перед всеми членами класса.
Других решений пока нет …