Не волнуйтесь, именованный установочный объект не будет уничтожен раньше времени, которое находится в конце области видимости.Он будет уничтожен как обычно: в порядке, обратном построению.
Однако, есть несколько незначительных проблем с опубликованным кодом.С одной стороны, деструктор FScopedSetter
не обязательно должен быть виртуальным, поскольку здесь нет наследования.
И T::operator=(const T&)
никогда не должен генерировать (лучше объявить noexcept
), в противном случае деструктор вашего класса присваивателя области действияможет бросить.Если ваш код нацелен на C ++ 11, было бы еще лучше переместить bOutOfScopeValue
в *Object
:
FScopedSetter(T& InObject, T InbOutOfScopeValue)
: Object(&InObject)
, bOutOfScopeValue(InbOutOfScopeValue)
{
}
~FScopedSetter()
{
static_assert(noexcept(*Object = std::move(bOutOfScopeValue)),
"Move assignment of your data type may throw. Make sure it doesn't.");
*Object = std::move(bOutOfScopeValue);
}
, а для доступа к *Object
может потребоваться синхронизация, в зависимости от того, являются ли «задачи»иметь какое-то отношение к "потокам".