C++ CONTAINING_RECORD и standart layout
Хочу использовать макрос CONTAINING_RECORD на структуре event_t и поле entry, которое первое в этой структуре:
#include <iostream>
#include <windows.h>
#include <winnt.h>
struct struct_x_t {
int x;
};
struct struct_y_t : struct_x_t {
int y;
};
struct event_t
{
SLIST_ENTRY entry{};
std::string string{};
};
static_assert(FIELD_OFFSET(event_t, entry) == 0); // OK
static_assert(std::is_standard_layout_v<event_t>); // ASSERT
int main()
{
SLIST_HEADER header{};
InitializeSListHead(&header);
event_t event;
event.string = "Strangers in the night Exchanging glances Wandering in the night";
InterlockedPushEntrySList(&header, &event.entry);
{
auto* e = InterlockedPopEntrySList(&header);
auto* event = CONTAINING_RECORD(e, event_t, entry);
std::cout << event->string.c_str() << std::endl;
}
}
Но эта структура не соответсвует требованиям standart layout из-за того, что struct_y_t унаследована от struct_x_t и у них у обоих есть поля. Нужно ли соблюдать это требование, если офсет у entry и так равен нулю и код работает корректно?
Среда: Visual Studio 2017 (15.9.40). Флаги: /std:c++latest