Является ли неопределенным поведением наличие структуры, отличной от POD, наследуемой от структуры POD в С++

Я использую C-совместимую библиотеку, которая объявляет

typedef struct _gsk_oid {
    int                 count;
    gsk_uint32 *        elements;
} gsk_oid;

Я не могу изменить библиотеку. Хотя в моем C++ мне нужна структура OID, которую я могу использовать как gsk_oid, но у которой также есть конструктор, поэтому я могу создать OID в коде. Так что я

struct oidX : public gsk_oid
{
    oidX(int countX, gsk_uint32 first, ...);
    oidX(const gsk_oid *inOID);
    ~oidX();
};

Таким образом, я могу написать, например, oidX testOID1(9, 1, 3, 6, 1, 5, 5, 7, 48, 1); , а затем использовать testOID1 в контексте, который ожидает gsk_oid.

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

Как вы это используете? Что это за странные результаты?

Etienne de Martel 24.07.2023 02:08

Что значит «плохая идея»? Кажется, это вопрос мнения.

Sam Varshavchik 24.07.2023 02:09

Что std::is_pod говорит о ваших структурах?

Severin Pappadeux 24.07.2023 02:11

Такое наследование само по себе не является проблемой. В той степени, в которой есть проблема, она кроется где-то в не показанном коде. Для получения дополнительной помощи подготовьте минимально воспроизводимый пример.

Igor Tandetnik 24.07.2023 02:35

@EtiennedeMartel Странные результаты заключаются в том, что я вызываю метод, который ожидает gsk_oid * в качестве параметра. Мой код отладки показывает ожидаемые значения в oidX, но код отладки в вызываемом методе показывает неверные значения.

Charles 24.07.2023 03:04

@SamVarshavchik под «плохой идеей» я имею в виду, что это вызывает проблемы.

Charles 24.07.2023 03:04

Почти все, что можно сделать на C++, может привести к каким-то проблемам. В таком наследовании нет ничего плохого. Он хорошо сформирован. В той мере, в какой проблемы вы видите, это не может быть связано исключительно с этим типом наследования, а связано с каким-то другим фактором.

Sam Varshavchik 24.07.2023 03:47

@SamVarshavchik это тот ответ, который я ищу. Я не хочу, чтобы вы все отлаживали мою программу; Мне просто интересно, было ли наследование не-POD от POD и передача его по адресу методу, который ожидает POD, по своей сути проблематичным.

Charles 24.07.2023 04:05

На будущее: вопрос, который вы действительно хотите задать в следующий раз, заключается в том, является ли что-то «неопределенным поведением». «Плохая идея» может оставаться плохой идеей в общем смысле, но это не будет неопределенным поведением. «Неопределенное поведение» имеет устоявшееся значение. «Плохая идея» — это чисто субъективный термин, который здесь обычно осуждается.

Sam Varshavchik 24.07.2023 04:13

@SamVarshavchik достаточно честно. Я отредактировал вопрос.

Charles 24.07.2023 04:17

Использование ..., как вы, является устаревшей конструкцией «C» (va_args) со всеми видами проблем (безопасность и безопасность типов). Подумайте о том, чтобы переписать свой код в функцию/конструктор вариативного шаблона, например. template<typename... ags_t> oidX(int countX, gsk_uint32 first, args_t&&...).

Pepijn Kramer 24.07.2023 07:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет.

На самом деле добавить больше нечего. Нет ничего, на что можно было бы указать, что это незаконно.

Кроме того, если бы это была проблема, компилятору было бы тривиально сказать вам, что вы делаете что-то глупое, а он этого не делает.

Другие вопросы по теме