У мене такий клас:
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
// more stuff
};
Зазвичай я хочу, щоб за замовчуванням (нуль) ініціалізувати counts
масив, як показано.
Однак у вибраних місцях, визначених шляхом профілювання, я хотів би придушити ініціалізацію масиву, оскільки я знаю, що масив збирається перезаписати, але компілятор недостатньо розумний, щоб це зрозуміти.
Який ідіоматичний та ефективний спосіб створити такий "вторинний" конструктор з нульовим аргументом?
В даний час я використовую клас тегів, uninit_tag
який передається як фіктивний аргумент, наприклад:
struct uninit_tag{};
struct event_counts {
uint64_t counts[MAX_COUNTERS];
event_counts() : counts{} {}
event_counts(uninit_tag) {}
// more stuff
};
Тоді я називаю конструктор no-init, як event_counts c(uninit_tag{});
коли я хочу придушити будівництво.
Я відкритий до рішень, які не передбачають створення фіктивного класу, або якісь ефективніші, тощо.