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


Ответы (0 шт):