Возвращение встроенной определенной структуры с неинициализированным членом.C ++ - PullRequest
0 голосов
/ 27 февраля 2019

Этим вопросам уделялось слишком мало внимания на форумах.

Ранее их задавали, но никто не уловил эту маленькую деталь.В результате я не уверен, правильно ли я поступаю:

Простой пример :

struct TEST {
    bool a;
    int b;
};

TEST func() {
    return { false };
}

Это правильно?Обратите внимание, что значение int не инициализируется.Хотя не было бы проблемой просто установить его в 0, возникают другие проблемы:

struct _FILE_MUTEX {
    bool locked;
    HANDLE handle;
};

И последний член структуры может становиться все более и более сложным из вектора, массивов для указателей на функции.

Могу ли я оставить некоторые элементы пустыми при возврате встроенной инициализированной структуры?

1 Ответ

0 голосов
/ 27 февраля 2019

Это называется агрегатной инициализацией.

https://en.cppreference.com/w/cpp/language/aggregate_initialization

Если количество предложений инициализатора меньше, чем число членов и баз (начиная с C ++17) или список инициализаторов полностью пуст, остальные члены и базы (начиная с C ++ 17) инициализируются их инициализаторами по умолчанию, если это предусмотрено в определении класса, и в противном случае(начиная с C ++ 14) пустыми списками, в соответствии с обычными правилами инициализации списков (которые выполняют инициализацию значений для типов не классов и неагрегированных классов с конструкторами по умолчанию и инициализацию агрегатов для агрегатов).Если член ссылочного типа является одним из этих оставшихся членов, программа является некорректной.

Таким образом, в агрегатной инициализации вы позволяете предоставлять меньше предложений, чем членов в структуре.Каждый оставшийся элемент (например, X), который не имеет инициализатора по умолчанию, будет инициализирован как X {}.

...