Я хочу узнать, являются ли 2 обращения к Get()
с разными типами параметров в приведенном ниже коде потокобезопасными:
struct MethodTypeIndex
{
template <typename T>
static size_t Get(T)
{
static size_t index = NextIndex();
return index;
}
private:
static size_t NextIndex()
{
static size_t nextIndex = 0;
return nextIndex++;
}
};
С одной стороны, NextIndex()
вызывается во время инициализации index
и в соответствии со стандартом:
§6.7 [stmt.dcl] p4
Если элемент управления входит в объявление одновременно, а переменная будучи инициализированным, одновременное выполнение должно ждать завершения инициализации.
С другой стороны, я не знаю, рассматривается ли вызов NextIndex()
как часть инициализации index
. А если нет, то делает ли инициализация скобок?
static size_t index{ NextIndex() };
Или есть ли другие способы сделать его потокобезопасным, если я не хочу сделать nextIndex
atomic?