Я пытаюсь реализовать облегченную карту, просто используя массив элементов, чьи члены являются ключом и значением. Содержание карты известны во время компиляции, так что я думаю, использовать массив фиксированного размера следующим образом:Правильно инициализируйте статический массив объектов, не встречая фиаско порядка инициализации, используя ссылки на объекты
#include "stdafx.h"
#include <string>
// class Item is declared in file1.h. Definition could be in file1.cpp.
class Item
{
public:
Item(const std::string name) : m_name(name) {}
const std::string GetName() const { return m_name; }
private:
const std::string m_name;
};
// The static consts are declared in file2.h which includes file1.h.
static const Item ITEM1 = std::string("Item1");
static const Item ITEM2 = std::string("Item2");
static const Item ITEM3 = std::string("Item3");
static const Item ITEM4 = std::string("Item4");
// ItemMapEntry and ItemMapUser is defined in file3.h...
struct ItemMapEntry
{
const Item& key;
const Item& value;
};
class ItemMapUser
{
public:
void Run();
private:
static const ItemMapEntry map[];
};
// and declared in file3.cpp which includes file2.h.
const ItemMapEntry ItemMapUser::map[] =
{
{ ITEM1, ITEM2 },
{ ITEM3, ITEM4 }
};
void ItemMapUser::Run()
{
for (int i = 0; i < (sizeof(map)/sizeof(map[0])); i++)
{
printf("%s %s\n", map[i].key.GetName().c_str(), map[i].value.GetName().c_str());
}
}
// main.cpp includes file3.h.
int main()
{
ItemMapUser itemMapUser;
itemMapUser.Run();
}
Теперь мой вопрос: фрагмент кода работает как задумано, но я почему-то есть ощущение, что я полагаясь на порядок инициализации, чтобы ITEM1 был ITEM4, и их содержимое было инициализировано, прежде чем использовать их в Map ItemMapUser ::. Я просмотрел многие вопросы, относящиеся к этой теме (особенно те, у которых был тег static-order-fiasco), но не смог найти ни одного, связанного с использованием массивов.
- Могу ли я встретить фиаско порядка инициализации?
- Если нет, то, что мешает ему здесь?
- Имеет ли значение, что я использую массив? Как бы это выглядело, если я попытался инициализировать простую переменную, например, с помощью
const Item anotherItem = ITEM1;
?
Также см [AddressSanitizerInitializationOrderFiasco] (https://github.com/google/sanitizers/wiki/AddressSanitizerInitializationOrderFiasco). – jww